如何使用Java替换XML文档中的文本?
来源:
<body>
<title>Home Owners Agreement</title>
<p>The <b>good</b> thing about a Home Owners Agreement is that...</p>
</body>
期望的输出:
<body>
<title>Home Owners Agreement</title>
<p>The <b>good</b> thing about a HOA is that...</p>
</body>
我只希望替换<p>
标签中的文字。我尝试了以下方法:
replaceText(string term, string replaceWith, org.w3c.dom.Node p){
p.setTextContent(p.getTextContent().replace(term, replaceWith));
}
上述代码的问题是p
的所有子节点都丢失了。
答案 0 :(得分:1)
这里的问题是你实际上想要替换节点,而不仅仅是文本。 您可以遍历当前节点的子节点并将它们再次添加到新节点。然后替换节点。
但它需要大量工作并且对您的文档结构非常敏感。例如,如果有人将您的<p>
标记用div
打包,则必须更改解析。
此外,从CPU和内存利用率的角度来看,这种方法非常无效:您必须解析整个文档以更改其中的几个单词。
我的建议如下:尝试使用正则表达式。在大多数情况下,它足够强大。例如
之类的代码 xml.replaceFirst("(<p>.*?</p>)", "<p>The <b>good</b> thing about a HOA is that...</p>")
会起作用(至少在你的情况下)。
答案 1 :(得分:1)
好的,我找到了解决方案。
关键是您不想替换实际节点的文本。实际上只有文本的子代表。我能够用这段代码完成我需要的东西:
private static void replace(Node root){
if (root.getNodeType() == root.TEXT_NODE){
root.setTextContent(root.getTextContent().replace("Home Owners Agreement", "HMO"));
}
for (int i = 0; i < root.getChildNodes().getLength(); i++){
outputTextOfNode(root.getChildNodes().item(i));
}
}