2010-11-02 47 views
1

我想用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是Element代表)。不幸的是,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(); 
+0

什么Java和JAX-的版本P你在用吗?该方法存在一个错误http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6545684 – 2010-11-02 22:15:16

+0

//从DocumentBuilder.java编译(版本1.5:49.0,超级位) public abstract class javax.xml .parsers.DocumentBuilder。也使用java 1.6 – victor 2010-11-02 22:47:41

回答

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

望着文档的“setIgnoringElementContentWhitespace” - “由于对内容模型此设置的依赖要求解析器处于验证模式。”。您是否尝试过:

factory.setValidating(true);