0

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

这是我尝试解析的 xml 字符串的示例:

<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")

我想知道为什么会发生这种情况,以及我能做些什么来解决这个问题。

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

------编辑---- 为了更好地理解:

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

4

2 回答 2

0

它正在返回正确的文档。要对其进行测试,您只需浏览您的文档即可。

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

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

NodeList tags = doc.getElementsByTagNameNS("http://www.portalfiscal.inf.br/nfe", "NFe");
于 2013-01-03T19:54:35.270 回答
0

从我可以从您的各种评论中汇总的内容来看,我认为您误解了 xml 的工作原理。您表示您手动将命名空间添加到NFe元素。但是,在您的 xml 示例中,NFe节点已经具有该 namespace

在这个 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="..."属性放在父节点上,命名空间将应用于该节点和具有相同前缀(在这种情况下,没有前缀)的所有子节点。

于 2013-01-03T21:27:29.763 回答