У меня есть куча XML-документов, которые содержат личную информацию, которую мне нужно заменить поддельными данными. Узел Person содержит следующие элементы:Быстрая замена значений узлов XML
- uuid - обязательно, не следует касаться.
- ПгвЬЫате - опционально
- LastName - опционально
- адрес - по желанию
- PersonId - требуется
Человек может появляться много раз, и в этом случае следует использовать одни и те же поддельные данные, т.е. если два узла Person имеют одинаковый идентификатор personID, они должны получать одинаковый поддельный идентификатор.
Я реализовал некоторый Java-код, который строит дерево DOM из строки XML и заменяет узлы, прежде чем записывать их обратно в строку. Это прекрасно работает, но поскольку у меня так много документов, мне было интересно, есть ли более быстрый подход. Может быть, через регулярные выражения или XSLT или что-то еще?
Вот пример документа:
<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>
И это моя текущая реализация:
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);
}
}
«fast» Вы хотите сказать, более совершенный или элегантный? –
Каковы правила создания фальшивых атрибутов firstName, lastName, address и personId? –
@DioF более совершенный – aznan