偽のデータに置き換える必要がある個人情報を含む XML ドキュメントがたくさんあります。Person ノードには、次の要素が含まれています。
- uuid - 必須です。触れないでください。
- firstName - オプション
- 姓 - オプション
- 住所 - オプション
- 個人ID - 必須
人物が何度も現れる可能性があります。その場合、同じ偽のデータを使用する必要があります。つまり、2 つの Person ノードが同じ personID を持つ場合、両方とも同じ偽の ID を受け取る必要があります。
XML 文字列から DOM ツリーを構築し、それを文字列に書き戻す前にノードを置き換える Java コードをいくつか実装しました。これは問題なく機能しますが、ドキュメントが非常に多いため、より高速なアプローチがあるかどうか疑問に思っていました。たぶん、正規表現や 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);
}
}