2014-05-09 21 views
0

我无法从下面的xml文件读取属性值。我是XPath的新手,尝试了所有可用的解决方案,但都没有运气。如何使用NameSpace解析XML文件uri

下面是输入XML

<?xml version="1.0" encoding="UTF-8"?> 
    <ns0:TPML xmlns:ns0="urn:x-schemas-xx:tpmbase/tpml/tpml_1_2"> 
<ns1:tpHeader xmlns:ns1="urn:x-schemas-xx:tpmbase/tpml/tpheader_1_2"> 
    <ns1:messageTimestamp>2010-02-22T11:49:24.13Z</ns1:messageTimestamp> 
    <ns1:messageSender>Sml2Tpml</ns1:messageSender> 
    <ns1:originatingSystem> 
     <ns1:name>SummitGboUtp</ns1:name> 
     <ns1:location>LDN</ns1:location> 
    </ns1:originatingSystem> 
    <ns1:trackingId>3345069L</ns1:trackingId> 
    <ns1:tradeId>3345069L</ns1:tradeId> 
    <ns1:transactionId/> 
    <ns1:versionNo>1</ns1:versionNo> 
</ns1:tpHeader> 
</ns0:TPML> 

这里是Java代码

package com.db.test.main; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Iterator; 

import javax.xml.namespace.NamespaceContext; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 

public class SummitTestXSL 
{ 
    public static void main(String arg[]) 
    { 

     try 
     { 
      FileInputStream file = new FileInputStream(new File("TestXml.xml")); 
      DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder =builderFactory.newDocumentBuilder(); 
      Document xmlDocument = builder.parse(file); 
      XPath xPath = XPathFactory.newInstance().newXPath(); 
      xPath.setNamespaceContext(new MyNamespaceContext()); 

      System.out.println("*************************"); 

      String expression="/ns0:TPML/ns1:tpHeader/ns1:messageTimestamp"; 

      System.out.println(expression); 

      String str = xPath.compile(expression).evaluate(xmlDocument); 

      System.out.println(str); 

     } catch (XPathExpressionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParserConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally 
     { 

     } 

    } 


    private static class MyNamespaceContext implements NamespaceContext { 

     public String getNamespaceURI(String prefix) { 
      if("ns0".equals(prefix)) { 
       return "urn:x-schemas-xx:tpmbase/tpml/tpml_1_2"; 
      } 
      else if("ns1".equals(prefix)) 
      { 
       return "urn:x-schemas-xx:tpmbase/tpml/tpheader_1_2"; 
      } 
      return null; 
     } 

     public String getPrefix(String namespaceURI) { 
      return null; 
     } 

     public Iterator getPrefixes(String namespaceURI) { 
      return null; 
     } 

    } 
} 

我想读messageTimeStamp的价值。

+0

您在问题中遇到的代码有什么错误? –

+0

[javax.xml,XPath不可能从具有名称空间的XML中提取]的可能重复(http://stackoverflow.com/questions/23203421/javax-xml-xpath-is-not-extracted-from-xml-with-namespaces ) – JLRishe

回答

1

看起来你并不像你在DocumentBuilderFactory上设置NamespaceAware。您需要在创建之前执行此操作:builder

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
builderFactory.setNamespaceAware(true);  // <---- This line 
DocumentBuilder builder =builderFactory.newDocumentBuilder();