如何使用Java替换XML文档中的文本

时间:2011-10-05 17:26:14

标签: java xml

如何使用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的所有子节点都丢失了。

2 个答案:

答案 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));
    }
}