Java和XML:读有或没有命名空间的XML标记
问题描述:
我们正在尝试构建一个接收一些XML文件的服务。但是人们发送它,有时使用命名空间,有时不使用。例如:Java和XML:读有或没有命名空间的XML标记
<?xml version="1.0" encoding="UTF-8"?>
<ds:EnvioDoc version="1.0" xmlns:ds="http://my.domain">
<ds:Cabecera version="1.0">
<ds:IdRec>215217190015</ds:IdRec>
<ds:IdEm>211003420017</ds:IdEm>
<ds:IdDoc>2995019</ds:IdDoc>
</ds:Cabecera>
<Cuerpo>
<CorpDoc version="1.0" xmlns="http://my.domain" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<body>
<Fecha>2016-08-12T00:11:50-03:00</Fecha>
[..]
或能来,如:
<?xml version="1.0" encoding="UTF-8"?>
<EnvioDoc version="1.0" xmlns="http://my.domain">
<Cabecera version="1.0">
<IdRec>215217190015</IdRec>
<IdEm>211003420017</IdEm>
<IdDoc>2995019</IdDoc>
</Cabecera>
<Cuerpo>
<CorpDoc version="1.0" xmlns="http://my.domain" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<body>
<Fecha>2016-08-12T00:11:50-03:00</Fecha>
[..]
我们曾尝试使用此代码阅读本文件:
File edocFile = new File(fileName);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(edocFile);
//recomendado http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
doc.getDocumentElement().normalize();
NodeList nlCabecera = doc.getElementsByTagNameNS("*","Cabecera");
Node cabeceraNode = nlCabecera .item(0);
if (cabeceraNode.getNodeType() == Node.ELEMENT_NODE) {
但要在如线NullPointerExsception。
有什么建议吗?
TIA
答
一个你可以把它带或不带命名空间的工作方式如下。请注意,此解决方案使用XPATH,尽管这不能解决NPE问题,但解决方案将适用于带或不带名称空间的情况。
public static void main(String[] args) throws Exception {
File fXmlFile = new File("C:\\DevelopmentTools\\3.CODE\\XMLWithNS.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList list = (NodeList) xpath.evaluate("//*[local-name()='Cabecera']", doc, XPathConstants.NODESET);
System.out.println("Size of the list is " + list.getLength());
}
答
要使用名称空间感知的DOM方法,如getElementsByTagNameNS
你需要确保你通过你的工厂用于创建DOM解析器/ DocumentBuilder的设置dbFactory.setNamespaceAware(true);
使用一个名称空间感知的DOM。
如果你想使用命名空间,那么我将开始设置'dbFactory.setNamespaceAware(true);'。 –
还要注意,这两个示例都使用相同的名称空间,仅作为第二个示例中的默认名称空间,并且在第一个示例中使用了前缀。 –
非常感谢!它正在工作! – user1748166