【问题标题】:Getting child's value as a String将孩子的价值作为字符串
【发布时间】:2013-04-02 00:34:30
【问题描述】:

解释自己的最佳方式是给你看一段代码:

这是我正在解析的 XML 文件:

<module>
    <name>name1</name>
    <type>type</type>
    <content>
        <p>This is some piece of code that should be treated as a full string, even that 'p' tag, because I want to use all content inside p tag for a webview in android.
        </p>
        <h1>This is a big classy title in html</h1>
    </content>
</module>

正如您在p 标签中看到的那样,基本上我想获取&lt;content&gt; 标签的内容并将其保存到要处理的字符串中。所以最后,我想初始化一个字符串,如下所示:

String content = "&lt;p&gt; This is some piece.......&lt;/p&gt; &lt;h1&gt;This is....&lt;/h1&gt;";

这是我用来获取&lt;name&gt;&lt;type&gt; 值的代码:

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(contingut);
doc.getDocumentElement().normalize();
NodeList nodes = doc.getElementsByTagName("module");
for (int i = 0; i < nodes.getLength(); i++) {
    Node node = nodes.item(i);
    Element element = (Element) node;
    if(element.getNodeType() == Element.ELEMENT_NODE){
        System.out.println(getValue("name",element));
        System.out.println(getContent("content",element));
    }
}
private static String getValue(String tag, Element element) {
    String value="";
    try {
        NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
        Node node = (Node) nodes.item(0);
        value=node.getNodeValue();
    } catch (Exception e){
        value=null;
    }
    return value;
}

例如,在解析时,名称正确打印name1,但content 返回空白。

知道如何将&lt;content&gt; 的内容作为字符串获取吗?

谢谢。

编辑

private static String getContent(String tag, Element element) {
    String value="";
    try {
        Node nodes = element.getElementsByTagName(tag).item(0);
        value = nodes.getTextContent();
    } catch (Exception e){
        value=null;
    }
    return value;
}

Log.d("debugging",getContent("content",element));

这是打印这个: %20%20%20%20%20This%20some%20piece ....

它似乎没有返回字符串&lt;p&gt;

【问题讨论】:

  • 您发布的xml格式不正确,dom解析器将抛出解析异常。如果这是您想要按照@AlexS 建议解析的 xml,您可能需要使用 SAX Parser。
  • @code13 我的错,写在这里的时候打错了。它现在已正确关闭。
  • 是否可以将所有标签都放在CDATA内容下,还是应该专门这样?
  • 应该是这种方式,因为 xml 是由 3rd 以这种方式发送的。
  • @SergiCastellsaguéMillán 您是否尝试过在我的答案中发布的 getContent 函数,因为我尝试使用您的 xml 及其为我工作(它与您的 getValue 相同,只是函数从 getValue 更改为 getContent)。

标签: java xml parsing xml-parsing


【解决方案1】:

由于getTextContent 不返回任何标记,我认为使用任何节点方法都不可能。

我看到的唯一方法(如果您想使用 DocumentBuilder)是,您编写一些代码从节点列表中重建字符串(遍历节点和节点属性)。

作为我的意思的一个小草图:(仅限 javalike 伪代码)

string rebuild(NodeList nodeList) {
    string result = "";
    for (Node n : nodeList) {
        result += "<" + node.getNodeName() + " ";
        NamedNodeMap aMap = node.getAttributes();
        if (aMap != null) {
            int aMapLength = aMap.getLength();
            for (int i=0; i<aMapLength; ++i) {
                Node a = aMap.item(i);
                result += a.getNodeName() + "=" + a.getValue() + " ";
            }
        }
        NodeList nList = node.getChildNodes();
        if (nList == null) {
            result += "/>";
        } else {
            result += ">";
            result += rebuild(nList);
            result += "</" + node.getNodeName() + ">";
        }
    }
    return result;
}

您还可以创建一个 xsd 文件并使用 xjc (JAXB) 创建 Java 类。有很多关于如何做到这一点的好教程(取决于您的 IDE)。 然后,您可以根据需要让 JAXB 编组/解组所有内容。

另一种方法是您实现自己的 SaxHandler 并使用 SAXParser 和 SAXParserFactory,这将是相当多的工作。

【讨论】:

  • 我的解析器已经有 800 多行了,现在无法处理大的实现更改...
  • 800 行是相当多的,但是对 JAXB 的更改应该不会太麻烦,并且您将受益于 XSD 文件(验证)和易于采用新元素。 .
  • 如果我觉得受到很大限制会考虑它,但现在它的工作还算不错。顺便说一句,我已经编辑了我的代码,设法获得了值,但它以某种方式忽略/更改了空间 html 代码的&lt;p&gt;tags。看看 =)
  • getTextContent() 不包含任何标记且未标准化。
  • 就是这样。我认为这是实现这一目标的最佳方式。我们发现 getTextContent 正在删除标签。所以我认为这样做的一种方式,就像你正在做的那样。我将''符号解码为相应的html&321;(无论如何),然后当我渲染该文本时,我再次将其编码为'
【解决方案2】:

使用 getTextContent() 代替 getValue() 函数。以下是一个示例(与您的 getValue 函数相同)。

private static String getContent(String tag, Element element) {
    String value="";
    try {
        NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
        Node node = (Node) nodes.item(0);
        value=node.getTextContent(); // notice getTextContent()
    } catch (Exception e){
        value=null;
    }
    return value;
}

它适用于格式良好的 xml

<module>
    <name>name1</name>
    <type>type</type>
    <content>
        <p>This is some piece of code that should be treated as a full string, even that 'p' tag, because I want to use all content inside p tag for a webview in android.
        </p>
        <h1>This is a big classy title in html</h1>
     </content>
</module>

【讨论】:

  • 返回空白。即使查看我的getContent 函数,我也已将我的主要问题放入编辑中。看起来有点像你的,但我的是返回内容,但格式很奇怪。
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 2014-06-13
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多