簡體   English   中英

Xpath.evaluate()方法在JAVA上不返回任何值

[英]Xpath.evaluate() method does not return any value on JAVA

我有一個這樣的XML示例文件:

<?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它對我也很有用。

先感謝您。

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

如果要在啟用了命名空間的情況下進行解析,即在newDocumentBuilder()之前調用documentBuilderFactory.setNamespaceAware(true) newDocumentBuilder() ,則可以使用

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

我認為"namespace-uri(/*)" XPath將返回URI(完整字符串,不僅在last : )。

您需要考慮默認名稱空間聲明,如如何在具有默認名稱空間的xml文檔上使用XPath中所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM