2011-10-05 73 views
1

如何使用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所有子节点迷路。

回答

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)); 
    } 
} 
1

这里的问题是,你实际上想要替换节点,而不仅仅是文本。 您可以遍历当前节点的子节点,并将它们再次添加到新节点。然后替换节点。

但它需要大量的工作,对你的文档结构非常敏感。例如,如果有人会用div包装您的<p>标签,您将不得不更改解析。

此外,从CPU和内存使用的角度来看,这种方法是非常无效的:您必须解析整个文档以更改其中的几个单词。

我的建议如下:尝试使用正则表达式。在大多数情况下,它足够强大。对于像

xml.replaceFirst("(<p>.*?</p>)", "<p>The <b>good</b> thing about a HOA is that...</p>")

将工作示例代码(在你的情况下,至少)。

+0

谢谢。正则表达式是可能的,但我的例子是从我实际上必须做的事情中简化的。我所取代的是依赖于各种嵌套元素。通过替换System.Xml.XmlNode.InnerXml,我能够很容易地完成使用C#的替换 – joe

相关问题