在 java、dom、xml 解析中设置新节点值的问题

Posted

技术标签:

【中文标题】在 java、dom、xml 解析中设置新节点值的问题【英文标题】:Problems setting a new node value in java, dom, xml parsing 【发布时间】:2011-06-08 12:51:48 【问题描述】:

我有以下代码:

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder();
StringReader reader = new StringReader(s);
InputSource inputSource = new InputSource(reader);
Document doc_ = dBuilder.parse(inputSource);

然后我想使用以下代码在根节点下的那个节点中创建一个新元素:

Node node = doc_.createElement("New_Node");
node.setNodeValue("New_Node_value");
doc_.getDocumentElement().appendChild(node);

问题是节点被创建并附加,但值没有设置。我不知道当我查看我的 xml 时是否看不到该值,如果它以某种方式隐藏,但我不认为是这种情况,因为我试图在创建节点调用之后获取节点值它返回null。 我是 xml 和 dom 的新手,我不知道新节点的值存储在哪里。它像一个属性吗?

<New_Node value="New_Node_value" />

还是把价值放在这里:

<New_Node> New_Node_value </New_Node>

任何帮助将不胜感激,

谢谢,乔希

【问题讨论】:

您是否正在将新的 DOM 写回文件中?我没有看到任何关于写作的参考,你指的是查看 xml。 @RD01 - 是的,我将其写回文件中。我想我现在的主要问题是如果 node.setNodeValue() 不设置文本或属性,它会做什么? 【参考方案1】:

以下代码:

Element node = doc_.createElement("New_Node");
node.setTextContent("This is the content");  //adds content
node.setAttribute("attrib", "attrib_value"); //adds an attribute

产生:

<New_Node attrib="attrib_value">This is the content</New_Node>

希望这可以澄清。

【讨论】:

嗯,这很清楚,那么 node.setNodeValue() 是做什么的? setNodeValue 因节点类型而异(查看 javadocs 中的表格:download.oracle.com/javase/6/docs/api/org/w3c/dom/Node.html)。如果节点是Element,那么设置nodeValue 什么都不做,因为nodeValue 是null 感谢您的澄清!【参考方案2】:

为了澄清,当你创建节点时使用:

Attr x = doc.createAttribute(...);
Comment x = doc.createComment(...);
Element x = doc.createElement(...);   // as @dogbane pointed out
Text x = doc.createTextNode(...);

而不是使用通用节点来获取您从每个方法中返回的内容。这将使您的代码更易于阅读/调试。

其次,getNodeValue() / setNodeValue() 方法的工作方式不同,具体取决于您拥有的节点类型。请参阅Node class 的摘要以供参考。对于元素,您不能使用这些方法,但对于文本节点,您可以。

正如@dogbane 所指出的,使用setTextContent() 作为该元素标签之间的文本。请注意,这将破坏任何现有的子元素。

【讨论】:

【参考方案3】:

这是其他解决方案,在我的情况下,此解决方案有效,因为 setTextContent() 函数不存在。我正在使用 Google Web Toolkit (GWT)(它是一个 Java 开发框架),并且我导入了 XMLParser 库,因为我可以使用 DOM Parser。

导入 com.google.gwt.xml.client.XMLParser;

文档文档 = XMLParser.createDocument();

元素节点 = doc.createElement("New_Node"); node.appendChild(doc.createTextNode("value"));

doc.appendChild(节点);

结果是:

New_Node> 值 /New_Node>

【讨论】:

【参考方案4】:
<New_Node value="New_Node_value" />

'value'是一个属性

新节点

元素,为了进入 DOM 我建议你http://www.w3schools.com/htmldom/default.asp

【讨论】:

我知道在那个实例中值是一个属性,但我不知道当我 setNodeValue 时值是什么以及为什么我尝试的代码不起作用。

以上是关于在 java、dom、xml 解析中设置新节点值的问题的主要内容,如果未能解决你的问题,请参考以下文章

禁用时在某个活动中设置新的ActionBar

dom4j解析xml重复节点

java解析xml的几种方式哪种最好?

java解析xml文件,会把节点属性中的换行转换成空格,怎样才能避免此类转换,即保留换行

java中dom4j解析xml文件怎么获取节点属性

XML文件解析实践(DOM解析)