Java和XML:使用或不使用命名空间读取XML标记

时间:2016-08-18 14:57:52

标签: java xml namespaces

我们正在尝试构建一个接收一些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) {

但在if行中获取NullPointerExsception。

有什么建议吗?

TIA

2 个答案:

答案 0 :(得分:2)

要使用名称空间感知的DOM方法,例如getElementsByTagNameNS,您需要通过在用于创建DOM解析器/ DocumentBuilder的工厂上设置dbFactory.setNamespaceAware(true);来确保使用名称空间感知DOM。

答案 1 :(得分:0)

使用或不使用命名空间可以使其工作的一种方法如下。请注意,此解决方案使用XPATH,虽然这不能解决NPE问题,但您可以使用该解决方案适用于带或不带命名空间的情况。

Bad request