【问题标题】:Java and XML: Read XML tags with or without namespaceJava 和 XML:读取带或不带命名空间的 XML 标记
【发布时间】:2016-08-18 14:57:52
【问题描述】:

我们正在尝试构建一个接收一些 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 行中得到一个 NullPointerException。

有什么建议吗?

TIA

【问题讨论】:

  • 如果你想使用命名空间,那么我将从设置dbFactory.setNamespaceAware(true);开始。
  • 另请注意,您的两个示例都使用相同的命名空间,只是在第二个示例中作为默认命名空间,在第一个示例中使用前缀。
  • 非常感谢!它现在正在工作!
  • 我已将建议放入答案中,以便您将问题标记为已解决。

标签: java xml namespaces


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用或不使用命名空间的一种方法如下。请注意,此解决方案使用 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());
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多