Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java替换XML文档中的文本_Java_Xml - Fatal编程技术网

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

如何使用Java替换XML文档中的文本,java,xml,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> 上面代码的问题是p的所有子节点都丢失了。这里的问题是您实际上想要替换节点,而不仅仅是文本。 您可以遍历当前

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

资料来源:

<body>
<title>Home Owners Agreement</title>
<p>The <b>good</b> thing about a Home Owners Agreement is that...</p>
</body>

上面代码的问题是
p
的所有子节点都丢失了。

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

但是它需要大量的工作,并且对文档结构非常敏感。例如,如果有人将您的
标记包装为
div
,则您必须更改解析

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

我的建议如下:尝试使用正则表达式。在大多数情况下,它足够坚固。例如,类似于

xml.replaceFirst((*?

)”,“HOA的好处是…


将起作用(至少在你的情况下)

好吧,我找到了解决办法

关键是您不想替换实际节点的文本。实际上只有文本的子表示。我能够用这段代码完成我所需要的:

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));
    }
}
私有静态无效替换(节点根){
if(root.getNodeType()==root.TEXT\u节点){
setextcontent(root.getTextContent().replace(“房屋所有者协议”、“HMO”);
}
对于(int i=0;i
谢谢。正则表达式是可能的,但是我的例子从我实际需要做的事情简化了。我替换的内容取决于各种嵌套元素。通过替换System.Xml.XmlNode.InnerXml,我可以很容易地使用C完成替换
replaceText(string term, string replaceWith, org.w3c.dom.Node p){
       p.setTextContent(p.getTextContent().replace(term, replaceWith));

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