使用Java遍历xml文件的问题

时间:2010-11-02 22:08:31

标签: java xml

我正在尝试使用Java遍历一个简单的XML文档,但出于某种原因,空白被视为节点。例如,我有这个:

        factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation domImpl = builder.getDOMImplementation(); 
        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(true);
        DOMImplementationLS ls = (DOMImplementationLS) domImpl.getFeature("LS", "3.0");
        LSInput in = ls.createLSInput();
        in.setByteStream(is);
        LSParser parser = ls.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, "http://www.w3.org/2001/XMLSchema");

        document = parser.parse(in);
        document.getDocumentElement().getFirstChild()

因此,对于以下XML,返回的第一个子节点是空格的一些组合。

<?xml version="1.0"?>
<opendap>
<root url="http://localhost/" filter=".*" />
<rewrite>
    <var name="altitude" type="enum" resAttr="getNodeName" profattr="profattr"/>

</rewrite>
<constants>
    <catalogURL>http://google.com</catalogURL>
</constants>
<resAttr>
    <Publishers>person1</Publishers>
    <Publishers>person2</Publishers>
</resAttr>

</opendap>

我该如何解决这个问题?

编辑:我通过执行此操作来修复它(resattr是元素表示)。不幸的是,setValidating不起作用。

    for (Node child = this.resAttr.getFirstChild(); child != null; child = child.getNextSibling()){

        if (child.getFirstChild() != null && child.getFirstChild().getNodeValue() != null){
            String nodename = child.getNodeName();
            String nodevalue = child.getFirstChild().getNodeValue();

2 个答案:

答案 0 :(得分:2)

Sackers在正确的轨道上 - 解析器需要处于验证模式。该文档可能还需要一个语法(解析器文档还提到了XML规范的2.103.2.1部分。)

例如,配置了setValidating(true)setIgnoringElementContentWhitespace(true),解析器将剥离x和y元素之间的空白,但不会删除y元素,因为这是PCDATA:

<?xml version="1.0"?>

<!DOCTYPE x [
  <!ELEMENT x (y+)>
  <!ELEMENT y (#PCDATA)>
]>

<x>
  <y>  </y>
</x>

答案 1 :(得分:1)

查看'setIgnoringElementContentWhitespace'的文档 - '由于依赖于内容模型,此设置需要解析器处于验证模式。'。你试过了吗?

factory.setValidating(true);