在java中读取单个节点xml

时间:2011-03-16 10:28:49

标签: java xml

我正在向远程服务器发出请求并使用单个字符串标记获取此xml响应。

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1405</string>

如何获取字符串标记的值(1405)?

我试过这个,但它不起作用:

NodeList nl = doc.getElementsByTagName("string");    
Node n = nl.item(0);   
String root = n.getNodeValue();  

3 个答案:

答案 0 :(得分:2)

除了使用DOM之外还有其他选择:

XPath - javax.xml.path(作为Java SE 5的一部分提供)

一个例子:

import java.io.StringReader;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.xml.sax.InputSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        String xml = "<car><manufacturer>toyota</manufacturer></car>";
        String xpath = "/car/manufacturer";
        XPath xPath = XPathFactory.newInstance().newXPath();
        assertEquals("toyota",xPath.evaluate(xpath, new InputSource(new StringReader(xml))));
    }

}

JAXB - javax.xml.bind(作为Java SE 6的一部分提供)

域对象

package com.example;

import javax.xml.bind.annotations.*;

@XmlRootElement(name="string", namespace="http://schemas.microsoft.com/2003/10/Serialization/")
public class StringValue {

    private String value;

    @XmlValue
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

演示

package com.example;

public class Demo {

    public static void main(String[] args) {
        JAXBContext jc = JAXBContext.newInstance(StringValue.class);
        Unmarshaller u = jc.createUnmarshaller();
        StringValue stringValue = (StringValue) u.unmarshal(xml);
        System.out.println(stringValue.getValue());

    }

}

答案 1 :(得分:2)

您不必在Java代码中指定XML命名空间。你得到null而不是“1045”的原因是因为n.getNodeValue()实际上返回了元素节点(org.w3c.dom.Element)的值,而不是内部文本节点(org.w3c.dom.Text)。 / p>

String root = n.getTextContent();
String root = n.getFirstChild().getNodeValue(); // in some environments safer way

答案 2 :(得分:1)

这是因为文本“1405”不是&lt; string&gt;的值。标签的元素。它是一个文本节点的值,它是&lt; string&gt;的直接子节点。标签的元素。请参阅表here