【问题标题】:how to get value of CDATA in JDOM2如何在 JDOM2 中获取 CDATA 的值
【发布时间】:2013-04-14 16:25:24
【问题描述】:

我正在尝试使用 getText() 在 JDOM2 中检索 CDATA 值,但我只得到以下 -
<![CDATA[ ]]>

我的 XML 如下所示

<ROOT>
 <CHILD>
    <P><![CDATA[<ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>]]></P>
 </CHILD>
</ROOT>

CDATA 包含 XML 内容,我需要将其作为字符串存储在 elsewejhere 代码(sn-p)如下所示

XPathFactory xpfac = XPathFactory.instance();
XPathExpression<Element> xElements = xpfac.compile(sXpath,Filters.element(),null,Namespace.getNamespace("myns", "http://www.namespace.com/ns"));
List<Element> elements = xElements.evaluate(doc);       
for (Element xElem : elements) {
    if(!isCDATA)
    {
        sRetval=xElem.getValue();
    }
    else
    {
        sRetval=xElem.getText();
    }
    return sRetval;
}

getValue() 工作正常,而 getText() 仅返回 &lt;![CDATA[ ]]&gt;

当然,我的 XPAHT 看起来像这样 //ROOT/CHILD/P 知道如何获取 CDATA 的内容吗?

编辑:如果我替换&lt;P&gt;&lt;![CDATA[ SOMECONTENT]]&gt;&lt;/P&gt;,我会得到“SOMECONTENT”..所以我无法从 CDATA 获取 XML 内容

【问题讨论】:

  • 为什么要检索CDATA 节点的text?似乎只需获取包含 &lt;P&gt; 标记的 textvalue 就足够了。
  • 如果getValue() 工作正常,为什么不直接使用它呢?
  • getValue() 没有返回整个 cdata,而只返回 CDATA 中的 TEXT 内容(没有 标签)我的情况是

标签: java jdom-2


【解决方案1】:

我已尝试重现您的问题,但无法......(作为正确格式的答案发布)......

public static void main(String[] args) throws JDOMException, IOException {
    final String xml = "<ROOT>\n <CHILD>\n    <P><![CDATA[<ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>]]></P>\n </CHILD>\n</ROOT>";

    Document doc = new SAXBuilder().build(new StringReader(xml));
    XPathFactory fac = XPathFactory.instance();
    XPathExpression<Element> ex = fac.compile("//ROOT/CHILD/P", Filters.element());
    for (Element e : ex.evaluate(doc)) {
        System.out.printf("getValue() %s\n", e.getValue());
        System.out.printf("getText() %s\n", e.getText());
    }
}

产生:

getValue() <ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>
getText() <ROOT><ELEMENT>SOMECONTENT</ELEMENT></ROOT>

我对你有什么不同?

【讨论】:

  • 感谢您发布答案。当我执行 getValue() 时得到的是来自内部 xml 的没有节点的文本内容。例如我得到的是 SOMECONTENT 而不是 &lt;ELEMENT&gt;SOMECONTENT&lt;/ELEMENT&gt;。在为此挣扎了 2 天后,我开始探索其他方法,但徒劳无功。我正在使用 JDOM 2.0.4。我在代码中看到的区别是,我有一个命名空间声明,而你没有,但我认为这并不重要,因为当我使用 getValue() 时,我只获得了文本内容,我得到了一些内容,但不是全部(元素本身) e.getText() 回复我这个&lt;![CDATA[]]&gt;
  • 好的,不同之处在于输入 XML、输入 XPath 和命名空间都与您在此处发布的内容不同……这不是一个 挑战。请更新您的问题以反映您问题的真实状态。此外,最好在 JDOM GitHub github.com/hunterhacker/jdom/issues/new 上发布一个更真实地表示您的问题的问题。我本来打算今天发布 JDOM 2.0.5,但如果你有真正的问题,我会推迟到解决为止。
  • 谢谢@rolfl 我已经创建了一个问题([链接]github.com/hunterhacker/jdom/issues/117),但没有任何 XML 示例,因为我必须考虑其中的数据。在最坏的情况下,我必须准备一个 XML。就像我在这里提到的那样,我可以使用 System.XML 在 C# 中毫无问题地获取 CDATA 内容。如果您需要更多信息,请告诉我
  • 嗨 @rolfl 我已经发布了一个示例源代码,它可以在 github github.com/hunterhacker/jdom/issues/117 中重现问题的行为
  • 我对同一问题添加了评论。根本问题在于,转换过程正在向转换后的 XML 输出添加特殊的转换处理指令,而 JDOM 正在使用这些特殊指令来输出 XML。默认情况下,这些说明使 JDOM 的输出 XML 与转换的输出 XML 不同,这反过来又会导致您的困惑。
猜你喜欢
  • 2021-06-15
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2014-02-23
  • 2011-01-03
  • 1970-01-01
相关资源
最近更新 更多