黑莓:解析 XML 时如何获取 Node 的原始内容

Posted

技术标签:

【中文标题】黑莓:解析 XML 时如何获取 Node 的原始内容【英文标题】:Blackberry: How to get raw content of Node when parsing XML 【发布时间】:2013-01-02 20:06:44 【问题描述】:

我试图从通过 SOAP Web 服务调用返回的一些 XML 中提取一个 html 字符串。我的 Node 对象属于以下类:

org.w3c.dom.Node

这是我用来遍历节点的循环的代码示例:

for(int t = 0; t < elements; t++)


         Element myElement = (Element)elements.item(t);

         NodeList childNodes = myElement.getChildNodes();
         int numChildren = childNodes.getLength();

         for(int counter = 0; counter < numChildren; counter++)
         
             Node currentNode = childNodes.item(counter);
             NodeList currentNodeChildNodes = currentNode.getChildNodes();

             int numCurrentNodeChildren = currentNodeChildNodes.getLength();
             Node firstChild = currentNodeChildNodes.item( 0 );
         

现在,其中一些节点包含原始 html。这当然让他们看起来像有孩子。我想获取这些 html 节点并将其所有内容直接放入String。我试过currentNode.getTextContent(),它只产生一个java.lang.NullPointerException

有没有一种方法可以用来获取节点并将其原始内容作为字符串获取,而不管它是否包含子节点?

编辑:这是一个带有 html 内容的 XML 示例

<?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetInfoResponse xmlns="http://www.mycompany.com/">
      <GetInfoResult>
        <infoList>
          <Info>
            <iso>US</iso>
            <country_name>United States</country_name>
            <title>This is the title</title>
            <html_string><strong>NEWS</strong><h1>This is a section header</h1><p>Here is some information</p></html_string>
            <last_update_date>2013-01-01 00:00:00</last_update_date>
          </Info>
        </infoList>
        <faultResponse>
          <faultOccurred>boolean</faultOccurred>
          <faultDescription>string</faultDescription>
        </faultResponse>
      </GetInfoResult>
    </GetInfoResponse>
  </soap:Body>
</soap:Envelope>

【问题讨论】:

NPE 从何而来? 来自 getTextContent() 方法。不知道究竟是为什么,但我不再担心这一点,因为我后来意识到,currentNode.getTextContent() 根本不是我想要的。 你能完全改变服务吗?这是在 XML 中包含 HTML 的一种相当不寻常的方式。例如,RSS 只是对标签进行转义,这可以说不太容易出错,因为 HTML 不一定必须是有效的 XML。 我的意思是,如果您通常希望将 HTML 内容视为原子字符串,那么(在所有平台上)将其作为字符串发送到 Web 服务中会更容易,而不是作为XML 内容。 (如果您不想在 HTML 本身中包含 CDATA 部分,请使用转义或 CDATA。) 否则,您可以将文档重新序列化为黑莓上的String,但我手头没有 JDK,而且代码太繁琐,无法从内存中编写。 (基本思路是新建一个Document,将html_string的子节点导入其中,将文档写入StringWriter,获取其内容。) 【参考方案1】:

混合 html 和 xml 内容通常是个坏主意。虽然 html 可以 像 xml (xhtml) 一样格式化,但通常不是。通过混合这两者,当您的 html 碰巧不是有效的 xml 时,您将面临导致 xml 解析失败的风险。相反,您应该将 html 内容编码为有效的 xml 元素值。如果你这样做了,那么你可以在java中使用Node.getTextContent()调用html_string元素来获取数据。

【讨论】:

以上是关于黑莓:解析 XML 时如何获取 Node 的原始内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XPATH 从 XML 中解析和获取准确的结果

如何从Element获取原始xml作为字符串

登录网站时如何从黑莓获取 GPS 坐标

黑莓 / j2me 的 rpc 库 ( json / xml / * )

从 Feedburner RSS 提要中获取原始 XML 数据

如何在 JavaScript node.js 中将 xml 文件解析为数组