【问题标题】:Parsing CDATA String as response from webservice将 CDATA 字符串解析为来自 web 服务的响应
【发布时间】:2014-11-12 08:05:36
【问题描述】:

我有以下来自 web 服务调用响应的字符串 CDATA 格式。

String outputString = "<![CDATA[<MYTAG><MYTAG1 type=\"java.util.vector\"><MyTAG2    type=\"java.util.hashtable\"><NAME type=\"java.lang.string\">XYZ</NAME><ADDRESS type=\"java.lang.string\">ABCD</ADDRESS></MYTAG2></MYTAG1></MYTAG>]]>"

当我尝试使用 DOM 解析器时。这个字符串给出了异常。

DocumentBuilder builder;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
Document outputXMLDocument = builder.parse(new InputSource(new StringReader(outputString)));
NodeList nodes = outputXMLDocument.getElementsByTagName("MYTAG");

我想解析这个响应并检索 NAME 和 ADDRESS TAG 的值。请建议处理此问题的最佳方法。

【问题讨论】:

  • 请检查这个 SO 问题 - stackoverflow.com/questions/8489151/how-to-parse-xml-for-cdata 这可能会有所帮助。
  • 该 CDATA 值必须来自 XML 文件,作为封闭节点的文本值。当您解析包含的 XML 时,您将拥有一个文本节点。启动另一个DocumentBuilder 并将从文本节点中提取的字符串值提供给它。那时,它不会是 CDATA 部分,因为 CDATA 仅存在于文档的序列化版本中,从不在 DOM 中。
  • 响应 web 服务调用。我没有任何节点在 CDATA 之前。正如我提到的那样,它只有字符串 String outputString = "XYZ
    ABCD
    ]] >"

标签: java parsing cdata


【解决方案1】:

CDATA 内的数据不会被解析器解析。 CDATA 中的部分旨在包含无法在XML 中发送的数据。假设您在 XML 中有 &lt;&amp;,它们有自己的特殊含义。这些类型的内容放在CDATA部分

下面的sn-p可以帮你从元素中解析出字符数据。

public static String getCharacterDataFromElement(Element e) {
  Node child = e.getFirstChild();
  if (child instanceof CharacterData) {
    CharacterData cd = (CharacterData) child;
      System.out.println(cd.getData());
    return cd.getData();
  }
  return "";
}

如果只有 CDATA 可用,您可以使用从 Web 服务获得的响应创建一个文档,然后执行解析。

希望对你有帮助!

【讨论】:

  • 事实上它没有。返回的数据仍然包裹在 CDATA 中
猜你喜欢
  • 2011-02-10
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2019-10-17
  • 1970-01-01
相关资源
最近更新 更多