解析没有命名空间的xml

时间:2013-01-03 19:34:23

标签: java xml-parsing

当我尝试从包含xml的字符串解析到org.w3c.dom.Document时出现解析问题。

以下是我正在尝试解析的xml String的示例:

<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">
   <idLote>123</idLote>
   <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
    ...
   </NFe>
</enviNFe>

问题是,在解析了que String之后,通过以下代码:

private Document documentFactory(String xml) throws SAXException,      
    IOException, ParserConfigurationException, DocumentException, TransformerException {    

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();      
    factory.setNamespaceAware(true);    

    Document document = factory.newDocumentBuilder().parse(      
        new ByteArrayInputStream(xml.getBytes()));    

return document;    
}

标签NFe在没有命名空间的情况下加载(xmlns =“http://www.portalfiscal.inf.br/nfe”)

我想知道为什么会这样,以及我可以做些什么来解决这个问题。

任何帮助都会很棒。 谢谢,对不起我的英语。

------ ---- EDIT 为了更好地理解:

此解析后将立即签署此xml,并将其发送到政府服务器(巴西)。 在此之后,我向该服务器发出另一个请求,以验证它是否已被处理。如果是的话,我会在出现任何错误时得到积极的回应。 我遇到的第一个问题是xml格式错误。发生这种情况是因为我在标签NFe中发送了没有该命名空间的xml。 为了解决这个问题,我在签名xml之后在文件中添加了它(名称空间)。 事实上这个问题已经解决,但另一个问题出现了:签名的差异。 因为我在没有命名空间的情况下签署了xml,并随之发送。

2 个答案:

答案 0 :(得分:0)

它正在返回正确的文档。要测试它,您可以浏览文档。

doc.getFirstChild().getFirstChild().getNextSibling().getNextSibling().getNextSibling().getNamespaceURI();

或尝试通过它的名称获取标签:

NodeList tags = doc.getElementsByTagNameNS("http://www.portalfiscal.inf.br/nfe", "NFe");

答案 1 :(得分:0)

从我的各种评论中我可以把它放在一起,我认为你误解了xml是如何工作的。您指示您手动将名称空间添加到NFe元素。但是,在您的xml示例中,NFe节点已经具有该命名空间

在这个xml中:

<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">
   <idLote>123</idLote>
   <NFe>
    ...
   </NFe>
</enviNFe>

所有节点都有“http://www.portalfiscal.inf.br/nfe”命名空间。通过将xmlns="..."属性放在父节点上,命名空间将应用于该节点,并且所有子节点具有相同的前缀(在这种情况下,没有前缀)。