0

次のような XML サンプル ファイルが 1 つあります。

<?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>

Document タグから xmlns 属性値を取得したい。このために、xpath の evaluate メソッドを使用しています。

            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それも役に立ちます。

前もって感謝します。

4

3 に答える 3

3

xmlns="..."宣言は、要素 (およびそのすべての子孫) が指定された名前空間にあることを意味するため、名前空間にない名前の要素のみが選択されるため、Document一致するものは得られません。 「正しい名前空間」は、最初に見つけようとしているものだからです。/DocumentDocument

しかし、これを行うのに 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();
于 2013-06-24T11:45:58.253 に答える
1

"namespace-uri(/*)"XPath は URI を返すと思います(最後の の後だけでなく、完全な文字列:)。

于 2013-06-24T11:32:04.390 に答える