将孩子的价值作为一个字符串

时间:2013-04-10 08:55:13

标签: java xml parsing xml-parsing

解释自己的最好方法是向您展示一段代码:

这是我正在解析的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标记中所读到的,基本上我想获取<content>标记的内容并将其保存到要处理的字符串中。所以最后,我希望有一个初始化的字符串,如:

String content = "<p> This is some piece.......</p> <h1>This is....</h1>";

这是我用来获取<name><type>值的代码:

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返回空白。

知道如何将<content>的内容作为字符串获取?

谢谢。

修改

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 ....

似乎它没有返回字符串<p>

2 个答案:

答案 0 :(得分:1)

由于getTextContent没有返回任何标记,我认为使用任何Node方法是不可能的。

我看到的唯一方法(如果你想使用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,这将是相当有用的。

答案 1 :(得分:1)

使用 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>