我正在尝试使用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();
答案 0 :(得分:2)
Sackers在正确的轨道上 - 解析器需要处于验证模式。该文档可能还需要一个语法(解析器文档还提到了XML规范的2.10和3.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);