当我尝试从包含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,并随之发送。
答案 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="..."
属性放在父节点上,命名空间将应用于该节点,并且所有子节点具有相同的前缀(在这种情况下,没有前缀)。