【问题标题】:Determine if a node is a CDATA section确定节点是否为 CDATA 部分
【发布时间】:2017-09-14 15:24:14
【问题描述】:

我正在尝试从 XML 节点中获取值并在 CDATA 部分出现问题。

我的 XML 看起来像:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <Test>This is my node</Test>
    <HelpContent><![CDATA[this is the CDATA section]]></HelpContent>
</root>

使用此代码:

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();      
Document doc = dBuilder.parse(currentFile);

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpathObj = xPathFactory.newXPath();
XPathExpression expr = xpathObj.compile("//*");

NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);      
int len = nodes.getLength();
for (int i = 0; i < len; i++){
    Node node = nodes.item(i);
    System.out.println("Node name [" + node.getNodeName() + "] of type [" + node.getNodeType() + "]");
    System.out.println("NodeValue: " + node.getNodeValue());
    System.out.println("TextContent: " + node.getTextContent());
}

我得到了以下信息:

> Node name [root] of type [1] 
> NodeValue: null 
> TextContent:      This is my
> node  this is the CDATA section
> 
> Node name [Test] of type [1] 
> NodeValue: null 
> TextContent: This is my node
> 
> Node name [HelpContent] of type [1] 
> NodeValue: null 
> TextContent: this is the CDATA section

如您所见,对于具有子节点的节点(在本例中只有根节点),我从子节点中提取了所有文本。 此外,您可以看到 getNodeType 始终在重新调整 1 (ELEMENT_NODE)...

问题只有在包含诸如“Test”和“TextContent”之类的数据但对于诸如“root”之类的节点为空或为空时,我如何才能获取节点的值?

谢谢。

【问题讨论】:

  • 链接的副本说明 XPath 忽略 CDATA 节点。如果你遍历 DOM 而不是使用 XPath,你应该能够找到它们。
  • 在 DOM 中 node.getNodeValue() 的元素节点为空。 w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/…。您可能希望向我们展示一个最小但完整的示例,以便我们重现您所说的结果,以及您期望的结果的解释。
  • 链接的副本似乎是指 CDATA 文字被剥离但返回值的事实......
  • @MartinHonnen 是的......我认为我搞砸了我的原始代码;我已经用示例更新了问题

标签: java xml xml-parsing


【解决方案1】:

我提出了这个解决方案...不确定这是否是正确的方法,但似乎可以按预期工作。

所以,为了获得像“Test”或“HelpContent”这样的节点的值,我用以下代码更新了代码:

NodeList childs = node.getChildNodes();

if (childs.getLength() == 1){
    System.out.println("TextContent: " + node.getTextContent());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2011-12-25
    • 2013-11-16
    相关资源
    最近更新 更多