Pregunta

I have one XML example file like this:

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

I want to retrieve xmlns attribute value from Document tag. For this I'm using xpath's evaluate method:

            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);

This code returns value as "".

I had tried changing:

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

for:

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

for testing and I got the same return "".

What I'm doing wrong?

The return I need is pain.001.001.05 but if I get all the string urn:iso:std:iso:20022:tech:xsd:pain.001.001.05 it is useful for me too.

Thank you in advance.

¿Fue útil?

Solución

The xmlns="..." declaration means that the Document element (and all its descendants) are in the specified namespace, so you won't get any match for /Document because that only selects elements named Document that are not in a namespace - and you can't declare a prefix for the right namespace because the "right namespace" is what you are trying to find out in the first place!

But you don't need XPath to do this - you already have

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

This is a non-namespace-aware DOM tree of the original document (because DocumentBuilderFactory is not namespace aware by default), in which xmlns is treated as an attribute, so you can get the value using

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

If you were parsing with namespaces enabled, i.e. you'd called documentBuilderFactory.setNamespaceAware(true) before newDocumentBuilder(), then you could use

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

Otros consejos

I think the "namespace-uri(/*)" XPath will return the URI (the full string, not only after the last :).

You need to take the default namespace declaration into account, as shown in How to use XPath on xml docs having default namespace.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top