2011-10-05 107 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

相關問題