Remplacement rapide de nœud XML valeurs

J'ai un tas de documents XML qui contiennent des informations personnelles que j'ai besoin de le remplacer avec de fausses données. La Personne nœud contient les éléments suivants:

  • uuid - requis ne doit pas être touché.
  • prénom - facultatif
  • nom - option
  • adresse - facultatif
  • personID - requis

Une personne peut s'afficher plusieurs fois, dans ce cas le même faux de données doit être utilisée, c'est à dire si deux Personne nœuds ont le même personID, elles doivent recevoir la même fausse carte d'identité.

J'ai mis en œuvre une partie de code Java qui permet de créer une arborescence DOM de la chaîne XML et remplace les nœuds avant de l'écrire à une chaîne. Cela fonctionne bien, mais depuis que j'ai tant de documents, je me demandais si il y a une approche plus rapide. Peut-être grâce à des expressions régulières ou XSLT ou quelque chose?

Voici un exemple de document:

<ADocument>
  <Stuff>
    ...
  </Stuff>
  <OtherStuff>
    ...
  </OtherStuff>
  <Person>
    <uuid>11111111-1111-1111-1111-111111111111</uuid>
    <firstName>Some</firstName>
    <lastName>Person</lastName>
    <personID>111111111111</personID>
  </Person>
  <Person>
    <uuid>22222222-2222-2222-2222-222222222222</uuid>
    <firstName>Another Person</firstName>
    <address>Main St. 2</address>
    <personID>222222222222</personID>
  </Person>
  <Person>
    <uuid>33333333-3333-3333-3333-333333333333</uuid>
    <firstName>Some</firstName>
    <lastName>Person</lastName>
    <personID>111111111111</personID>
  </Person>
  <MoreStuff>
    ...
  </MoreStuff>
</ADocument>

Et c'est mon actuel de mise en œuvre:

public String replaceWithFalseData(String xmlInstance) {
Document dom = toDOM(xmlInstance);
XPathExpression xPathExpression = XPathExpressionFactory.createXPathExpression("//Person");
List<Node> nodeList = xPathExpression.evaluateAsNodeList(dom);
for(Node personNode : nodeList) {
Map<String, Node> childNodes = getChildNodes(personNode);
String personID = childNodes.get("personID").getTextContent();
//Retrieve a cached fake person using the ID, or create a new one if none exists.
Person fakePerson = getFakePerson(personID);
setIfExists(childNodes.get("firstName"), fakePerson.getFirstName());
setIfExists(childNodes.get("lastName"), fakePerson.getLastName());
setIfExists(childNodes.get("address"), fakePerson.getAddress());
setIfExists(childNodes.get("personID"), fakePerson.getPersonID());
}
return toString(dom);
}
public Map<String, Node> getChildNodes(Node parent) {
Map<String, Node> childNodes = new HashMap<String, Node>();
for(Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
if(child.getLocalName() != null) {
childNodes.put(child.getLocalName(), child);
}
}
return childNodes;
}
public void setIfExists(Node node, String value) {
if(node != null) {
node.setTextContent(value);
}
}
  • Par "rapide" vous entendez plus performant ou le plus élégant?
  • Quelles sont les règles pour la création de faux prénom, nom, adresse et personId attributs?
  • plus performant
  • pour les noms et adresse, juste une chaîne de caractères arbitraire - pour personID, un de 12 caractères longue chaîne de chiffres
InformationsquelleAutor aznan | 2013-09-04