2013-06-24 47 views
0

返回任何值我有一個XML實例文件是這樣的:Xpath.evaluate()方法不會對JAVA

<?xml version="1.0" encoding="UTF-8"?> 
<!--Sample XML file generated by XMLSpy v2011 rel. 2 (x64) (http://www.altova.com)--> 
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.05"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.05 file://BE-FILE01/tverschu$/SR%20(Standards%20Release)/SR2013/ISO/Payments%20Initiation/SR2013_MX_Schemas_PaymentsInitiation/pain.001.001.05.xsd"> 
<CstmrCdtTrfInitn> 
    <GrpHdr> 
     <MsgId>ABC/120928/CCT001</MsgId> 
     <CreDtTm>2012-09-28T14:07:00</CreDtTm> 
     <NbOfTxs>3</NbOfTxs> 
     <CtrlSum>11500000</CtrlSum> 
     <InitgPty> 
      <Nm>ABC Corporation</Nm> 
      <PstlAdr> 
       <StrtNm>Times Square</StrtNm> 
       <BldgNb>7</BldgNb> 
       <PstCd>NY 10036</PstCd> 
       <TwnNm>New York</TwnNm> 
       <Ctry>US</Ctry> 
      </PstlAdr> 
     </InitgPty> 
    </GrpHdr> 
    <PmtInf> 
     <PmtInfId>ABC/086</PmtInfId> 
     <PmtMtd>TRF</PmtMtd> 
     <BtchBookg>false</BtchBookg> 
     <ReqdExctnDt>2012-09-29</ReqdExctnDt> 
     <Dbtr> 
      <Nm>ABC Corporation</Nm> 
      <PstlAdr> 
       <StrtNm>Times Square</StrtNm> 
       <BldgNb>7</BldgNb> 
       <PstCd>NY 10036</PstCd> 
       <TwnNm>New York</TwnNm> 
       <Ctry>US</Ctry> 
      </PstlAdr> 
     </Dbtr> 
     <DbtrAcct> 
      <Id> 
       <Othr> 
        <Id>00125574999</Id> 
       </Othr> 
      </Id> 
     </DbtrAcct> 
     <DbtrAgt> 
      <FinInstnId> 
       <BICFI>BBBBUS33</BICFI> 
      </FinInstnId> 
     </DbtrAgt> 
     <CdtTrfTxInf> 
      <PmtId> 
       <InstrId>ABC/120928/CCT001/01</InstrId> 
       <EndToEndId>ABC/4562/2012-09-08</EndToEndId> 
      </PmtId> 
      <Amt> 
       <InstdAmt Ccy="JPY">10000000</InstdAmt> 
      </Amt> 
      <ChrgBr>SHAR</ChrgBr> 
      <CdtrAgt> 
       <FinInstnId> 
        <BICFI>AAAAGB2L</BICFI> 
       </FinInstnId> 
      </CdtrAgt> 
      <Cdtr> 
       <Nm>DEF Electronics</Nm> 
       <PstlAdr> 
        <AdrLine>Corn Exchange 5th Floor</AdrLine> 
        <AdrLine>Mark Lane 55</AdrLine> 
        <AdrLine>EC3R7NE London</AdrLine> 
        <AdrLine>GB</AdrLine> 
       </PstlAdr> 
      </Cdtr> 
      <CdtrAcct> 
       <Id> 
        <Othr> 
         <Id>23683707994125</Id> 
        </Othr> 
       </Id> 
      </CdtrAcct> 
      <Purp> 
       <Cd>GDDS</Cd> 
      </Purp> 
      <RmtInf> 
       <Strd> 
        <RfrdDocInf> 
         <Tp> 
          <CdOrPrtry> 
           <Cd>CINV</Cd> 
          </CdOrPrtry> 
         </Tp> 
         <Nb>4562</Nb> 
         <RltdDt>2012-09-08</RltdDt> 
        </RfrdDocInf> 
       </Strd> 
      </RmtInf> 
     </CdtTrfTxInf> 
     <CdtTrfTxInf> 
      <PmtId> 
       <InstrId>ABC/120928/CCT001/2</InstrId> 
       <EndToEndId>ABC/ABC-13679/2012-09-15</EndToEndId> 
      </PmtId> 
      <Amt> 
       <InstdAmt Ccy="EUR">500000</InstdAmt> 
      </Amt> 
      <ChrgBr>CRED</ChrgBr> 
      <CdtrAgt> 
       <FinInstnId> 
        <BICFI>DDDDBEBB</BICFI> 
       </FinInstnId> 
      </CdtrAgt> 
      <Cdtr> 
       <Nm>GHI Semiconductors</Nm> 
       <PstlAdr> 
        <StrtNm>Avenue Brugmann</StrtNm> 
        <BldgNb>415</BldgNb> 
        <PstCd>1180</PstCd> 
        <TwnNm>Brussels</TwnNm> 
        <Ctry>BE</Ctry> 
       </PstlAdr> 
      </Cdtr> 
      <CdtrAcct> 
       <Id> 
        <IBAN>BE30001216371411</IBAN> 
       </Id> 
      </CdtrAcct> 
      <InstrForCdtrAgt> 
       <Cd>PHOB</Cd> 
       <InstrInf>+32/2/2222222</InstrInf> 
      </InstrForCdtrAgt> 
      <Purp> 
       <Cd>GDDS</Cd> 
      </Purp> 
      <RmtInf> 
       <Strd> 
        <RfrdDocInf> 
         <Tp> 
          <CdOrPrtry> 
           <Cd>CINV</Cd> 
          </CdOrPrtry> 
         </Tp> 
         <Nb>ABC-13679</Nb> 
         <RltdDt>2012-09-15</RltdDt> 
        </RfrdDocInf> 
       </Strd> 
      </RmtInf> 
     </CdtTrfTxInf> 
     <CdtTrfTxInf> 
      <PmtId> 
       <InstrId>ABC/120928/CCT001/3</InstrId> 
       <EndToEndId>ABC/987-AC/2012-09-27</EndToEndId> 
      </PmtId> 
      <Amt> 
       <InstdAmt Ccy="USD">1000000</InstdAmt> 
      </Amt> 
      <ChrgBr>SHAR</ChrgBr> 
      <CdtrAgt> 
       <FinInstnId> 
        <BICFI>BBBBUS66</BICFI> 
       </FinInstnId> 
      </CdtrAgt> 
      <Cdtr> 
       <Nm>ABC Corporation</Nm> 
       <PstlAdr> 
        <Dept>Treasury department</Dept> 
        <StrtNm>Bush Street</StrtNm> 
        <BldgNb>13</BldgNb> 
        <PstCd>CA 94108</PstCd> 
        <TwnNm>San Francisco</TwnNm> 
        <Ctry>US</Ctry> 
       </PstlAdr> 
      </Cdtr> 
      <CdtrAcct> 
       <Id> 
        <Othr> 
         <Id>4895623</Id> 
        </Othr> 
       </Id> 
      </CdtrAcct> 
      <Purp> 
       <Cd>INTC</Cd> 
      </Purp> 
      <RmtInf> 
       <Strd> 
        <RfrdDocInf> 
         <Tp> 
          <CdOrPrtry> 
           <Cd>CINV</Cd> 
          </CdOrPrtry> 
         </Tp> 
         <Nb>987-AC</Nb> 
         <RltdDt>2012-09-27</RltdDt> 
        </RfrdDocInf> 
       </Strd> 
      </RmtInf> 
     </CdtTrfTxInf> 
    </PmtInf> 
</CstmrCdtTrfInitn> 
</Document> 

我想要檢索的xmlns從文檔標籤屬性值。爲此,我使用xpath的評估方法:

  DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
     InputStream inputStream = new FileInputStream(new File("Business sample 1 pain.001.xml")); 
     org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(inputStream); 
     StringWriter stw = new StringWriter(); 
     Transformer serializer = TransformerFactory.newInstance().newTransformer(); 
     serializer.transform(new DOMSource(doc), new StreamResult(stw)); 

     XPathFactory factory = XPathFactory.newInstance(); 
     XPath xpath = factory.newXPath(); 


     String xml = stw.toString(); 

     InputSource xmlsource = new InputSource(new StringReader(xml)); 

     String value = xpath.evaluate(
      "Document/attribute::xmlns", xmlsource); 

     System.out.println(value); 

此代碼返回值爲「」。

我曾試圖改變:

String value = xpath.evaluate("Document/attribute::xmlns", xmlsource); 

爲:

String value = xpath.evaluate("Document/CstmrCdtTrfInitn/GrpHdr/MsgId", xmlsource); 

用於測試和我得到了同樣的回報 「」。

我在做什麼錯了?

我需要的退貨是pain.001.001.05但如果我得到所有字符串urn:iso:std:iso:20022:tech:xsd:pain.001.001.05它對我也很有用。

預先感謝您。

+0

哦,你不能說用XPath,只有當你在最後分割字符串':'。命名空間是整個字符串,不僅是最後一部分... –

回答

3

xmlns="..."聲明表示Document元素(及其所有後代)都在指定的命名空間,所以你不會得到任何匹配/Document因爲只有選擇不在一個命名空間命名爲Document元素 - 你無法爲正確的命名空間聲明前綴,因爲「正確的命名空間」就是你想要首先找到的東西!

但你並不需要XPath來做到這一點 - 你已經有

org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(inputStream); 

這是原始文件的非名稱空間感知 DOM樹(因爲DocumentBuilderFactory沒有名稱空間感知的默認),其中xmlns作爲屬性對待,這樣你就可以使用獲得價值

String xmlnsVal = doc.getDocumentElement().getAttribute("xmlns"); 
String lastSegment = xmlnsVal.substring(xmlnsVal.lastIndexOf(':') + 1); 
// this is safe even if xmlnsVal doesn't contain any colons - lastIndexOf 
// will return -1, so substring(0) is the whole xmlnsVal 

如果你用的命名空間解析啓用,即你叫documentBuilderFactory.setNamespaceAware(true)newDocumentBuilder()之前,那麼你可以使用

String xmlnsVal = doc.getDocumentElement().getNamespaceURI(); 
1

我認爲"namespace-uri(/*)" XPath將返回URI(完整的字符串,不僅在最後的:之後)。

+0

它將需要'/ *'(文檔元素,不管名稱)而不是'/'(根節點,它是'文件') –

+0

我站好了 –