不同命名空间中 select 个节点的 XPath
XPath to select nodes in different namespaces
我需要一些帮助来想出一个正确的 XPath 表达式来从 XML.
中提取值
我可以使用 jaxb 获取值,但是我需要 xpath,因为我有一个决定 table 我想要外部化的映射规则,如果我使用 jaxb 会导致很多嵌套 if/else 我想避免的语句,因此需要 xpath 方法。
我有一个 xml 文件,该文件至少由 4 个模式构成。我的意思是根模式在特定点有一个元素,上面写着 xs:any 并且在这个位置注入了一个基于不同模式的 xml 并且这反过来有一个类似的 xs:any 另一个xml 被注入以构建我使用的 final/actual xml。
这是我正在处理的实际 XML 结构(我有意修改了值)。下面 xml 中的两个文档节点基于不同的架构
<?xml version="1.0"?>
<env:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="CDTS-SUBMIT">
<env:Body>
<cdtPrefix>
<cdtprVersion>01</cdtprVersion>
<cdtprOperation>SUBMIT</cdtprOperation>
<cdtprFunction>GCAMS1O</cdtprFunction>
<cdtprDirectionFlag>O</cdtprDirectionFlag>
</cdtPrefix>
<cdtDataDescription>
<cdtddVersion>01</cdtddVersion>
<cdtddFirmId>ABC</cdtddFirmId>
<cdtddBusinessDataFormat>GCAMS1O-XML</cdtddBusinessDataFormat>
<cdtddReferenceNum>123</cdtddReferenceNum>
<cdtddTrackingNum>123</cdtddTrackingNum>
<cdtddDestination>AQ</cdtddDestination>
<cdtddSeqNum>0000000</cdtddSeqNum>
<cdtddCycleNum>00</cdtddCycleNum>
<cdtddBusinessDate>00000000</cdtddBusinessDate>
</cdtDataDescription>
<cdtBusinessData>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Fr>
<FIId>
<FinInstnId>
<BICFI>ABC</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>ABC </BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>ABC</BizMsgIdr>
<MsgDefIdr>seev.031.002.05</MsgDefIdr>
<BizSvc>CSD</BizSvc>
<CreDt>9999-99-99T00:02:17Z</CreDt>
</AppHdr>
<Document xmlns="urn:swift:xsd:seev.031.002.05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CorpActnNtfctn>
<NtfctnGnlInf>
<NtfctnTp>REPL</NtfctnTp>
<PrcgSts>
<Cd>
<EvtCmpltnsSts>COMP</EvtCmpltnsSts>
<EvtConfSts>CONF</EvtConfSts>
</Cd>
</PrcgSts>
</NtfctnGnlInf>
<PrvsNtfctnId>
<Id>00000000</Id>
</PrvsNtfctnId>
<EvtsLkg>
<EvtId>
<LkdOffclCorpActnEvtId>US8</LkdOffclCorpActnEvtId>
</EvtId>
<LkgTp>
<Cd>INFO</Cd>
</LkgTp>
</EvtsLkg>
<CorpActnGnlInf>
<CorpActnEvtId>000</CorpActnEvtId>
<OffclCorpActnEvtId>US7</OffclCorpActnEvtId>
<EvtPrcgTp>
<Cd>DISN</Cd>
</EvtPrcgTp>
<EvtTp>
<Cd>INTR</Cd>
</EvtTp>
<MndtryVlntryEvtTp>
<Cd>CHOS</Cd>
</MndtryVlntryEvtTp>
<UndrlygScty>
<FinInstrmId>
<OthrId>
<Id>J54675AA1</Id>
<Tp>
<Cd>CUSP</Cd>
</Tp>
</OthrId>
<Desc>JASDFKASDFADSFAFADSF</Desc>
</FinInstrmId>
<ClssfctnTp>
<ClssfctnFinInstrm>DBXXXX</ClssfctnFinInstrm>
</ClssfctnTp>
</UndrlygScty>
</CorpActnGnlInf>
<AcctDtls>
<ForAllAccts>
<IdCd>GENR</IdCd>
</ForAllAccts>
</AcctDtls>
<CorpActnDtls>
<DtDtls>
<RcrdDt>
<Dt>
<Dt>0000-04-03</Dt>
</Dt>
</RcrdDt>
</DtDtls>
<RateAndAmtDtls>
<Intrst>
<Rate>0</Rate>
</Intrst>
</RateAndAmtDtls>
<IntrstAcrdNbOfDays>0</IntrstAcrdNbOfDays>
</CorpActnDtls>
<CorpActnOptnDtls>
<OptnNb>001</OptnNb>
<OptnTp>
<Cd>CASH</Cd>
</OptnTp>
<DfltPrcgOrStgInstr>
<DfltOptnInd>true</DfltOptnInd>
</DfltPrcgOrStgInstr>
<DtDtls>
<RspnDdln>
<Dt>
<DtTm>0000-04-10T20:00:00-04:00</DtTm>
</Dt>
</RspnDdln>
</DtDtls>
<PrdDtls>
<ActnPrd>
<Prd>
<StartDt>
<Dt>
<DtTm>0000-04-06T00:00:00-04:00</DtTm>
</Dt>
</StartDt>
<EndDt>
<NotSpcfdDt>UKWN</NotSpcfdDt>
</EndDt>
</Prd>
</ActnPrd>
</PrdDtls>
<CshMvmntDtls>
<CdtDbtInd>CRDT</CdtDbtInd>
<IncmTp>
<Id>0004</Id>
<Issr>IRSX</Issr>
</IncmTp>
<DtDtls>
<PmtDt>
<Dt>
<Dt>0000-04-18</Dt>
</Dt>
</PmtDt>
</DtDtls>
<RateAndAmtDtls>
<IntrstRateUsdForPmt>
<RateTpAndAmtAndRateSts>
<RateTp>
<Cd>SCHD</Cd>
</RateTp>
<Amt Ccy="USD">21.17125</Amt>
</RateTpAndAmtAndRateSts>
</IntrstRateUsdForPmt>
<WhldgOfLclTax>
<Rate>15.315</Rate>
</WhldgOfLclTax>
</RateAndAmtDtls>
</CshMvmntDtls>
</CorpActnOptnDtls>
<CorpActnOptnDtls>
<OptnNb>002</OptnNb>
<OptnTp>
<Cd>CASH</Cd>
</OptnTp>
<OptnFeatrs>
<Cd>ASVO</Cd>
</OptnFeatrs>
<DfltPrcgOrStgInstr>
<DfltOptnInd>false</DfltOptnInd>
</DfltPrcgOrStgInstr>
<DtDtls>
<RspnDdln>
<Dt>
<DtTm>0000-04-10T20:00:00-04:00</DtTm>
</Dt>
</RspnDdln>
</DtDtls>
<PrdDtls>
<ActnPrd>
<Prd>
<StartDt>
<Dt>
<DtTm>0000-04-06T00:00:00-04:00</DtTm>
</Dt>
</StartDt>
<EndDt>
<NotSpcfdDt>UKWN</NotSpcfdDt>
</EndDt>
</Prd>
</ActnPrd>
</PrdDtls>
<CshMvmntDtls>
<CdtDbtInd>CRDT</CdtDbtInd>
<IncmTp>
<Id>0004</Id>
<Issr>IRSX</Issr>
</IncmTp>
<DtDtls>
<PmtDt>
<Dt>
<Dt>0000-04-18</Dt>
</Dt>
</PmtDt>
</DtDtls>
<RateAndAmtDtls>
<IntrstRateUsdForPmt>
<RateTpAndAmtAndRateSts>
<RateTp>
<Cd>SCHD</Cd>
</RateTp>
<Amt Ccy="USD">25</Amt>
</RateTpAndAmtAndRateSts>
</IntrstRateUsdForPmt>
<WhldgOfLclTax>
<Rate>0</Rate>
</WhldgOfLclTax>
</RateAndAmtDtls>
</CshMvmntDtls>
</CorpActnOptnDtls>
<AddtlInf>
<AddtlTxt>
<UpdDt>0000-04-04</UpdDt>
<AddtlInf> adfafadfasdfasdfasdfsdafadfdsafdf</AddtlInf>
</AddtlTxt>
</AddtlInf>
<Regar>
<NmAndAdr>
<Nm>Not Available</Nm>
</NmAndAdr>
</Regar>
<SplmtryData>
<Envlp>
<Document xmlns="urn:swift:xsd:supl.001.001.05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DTCCCANOCSDDataSD1>
<NtfctnGnlInf>
<PlcAndNm>/Document/CorpActnNtfctn/NtfctnGnlInf</PlcAndNm>
<CretDtAndTm>0000-04-24T11:34:09</CretDtAndTm>
<UpdDtAndTm>0000-04-24T20:02:16</UpdDtAndTm>
</NtfctnGnlInf>
<CorpActnGnlInf>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnGnlInf</PlcAndNm>
<EDSMsggElgbltyFlg>true</EDSMsggElgbltyFlg>
<DTCFCPElctnFlg>false</DTCFCPElctnFlg>
<AsstSvcrPrcgFlg>true</AsstSvcrPrcgFlg>
</CorpActnGnlInf>
<UndrlygScty>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnGnlInf/UndrlygScty</PlcAndNm>
<CtryOfListg>DE</CtryOfListg>
<IncmSrcCtry>JP</IncmSrcCtry>
<DTCAsstClss>CRPB</DTCAsstClss>
<DTCAsstTp>S500</DTCAsstTp>
</UndrlygScty>
<CorpActnDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnDtls</PlcAndNm>
<CutOffDays>0</CutOffDays>
<EDSMsggCtryCd>JP</EDSMsggCtryCd>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</CorpActnDtls>
<CorpActnDtDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnDtls/DtDtls</PlcAndNm>
<DTCPosCaptrDt>0000-04-03</DTCPosCaptrDt>
</CorpActnDtDtls>
<OptnDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[1]</PlcAndNm>
<XtndedOptnFeatrs>FORU</XtndedOptnFeatrs>
<DfltOptnFlg>true</DfltOptnFlg>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</OptnDtls>
<OptnDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[2]</PlcAndNm>
<XtndedOptnFeatrs>FORX</XtndedOptnFeatrs>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</OptnDtls>
<CshMvmntDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[1]/CshMvmntDtls[1]</PlcAndNm>
<DTCPayMtd>1</DTCPayMtd>
<DTCPayOrdr>0</DTCPayOrdr>
<NRATaxRptblFlg>false</NRATaxRptblFlg>
<DclrdGrssRate>
<AmtPricPerFinInstrmQty>
<AmtPricTp>ACTU</AmtPricTp>
<PricVal Ccy="USD">25</PricVal>
<FinInstrmQty>
<FaceAmt>1000</FaceAmt>
</FinInstrmQty>
</AmtPricPerFinInstrmQty>
</DclrdGrssRate>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</CshMvmntDtls>
<CshMvmntDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[2]/CshMvmntDtls[1]</PlcAndNm>
<DTCPayMtd>1</DTCPayMtd>
<DTCPayOrdr>0</DTCPayOrdr>
<NRATaxRptblFlg>false</NRATaxRptblFlg>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</CshMvmntDtls>
<Agt>
<PlcAndNm>/Document/CorpActnNtfctn/Regar/NmAndAdr</PlcAndNm>
<AgtId>00009910</AgtId>
</Agt>
</DTCCCANOCSDDataSD1>
</Document>
</Envlp>
</SplmtryData>
</CorpActnNtfctn>
</Document>
</cdtBusinessData>
</env:Body>
</env:Envelope>
我提取前几个元素没问题
像 /env:Envelope/env:Body/cdtBusinessData
cdtBusinessData 是主模式中采用 xs:any 的元素
.架构片段如下
<xs:element name="cdtBusinessData" form="unqualified">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
正是从这一点开始,我的 xpath 查询无法按照我期望的方式工作。
即 当我尝试 /env:Envelope/env:Body/cdtBusinessData/Document 时,它无法将其识别为 jxpath 上的正确路径。
在为选定节点提供 xpath(如 xpather/firepath/XpathBuilder)的不同工具上,我得到不同的值,none 其中 xpath 接受。
能否请您帮助我理解如何从上面的两个嵌入式节点中提取值 xml。
我已经为此苦苦挣扎了一段时间,终于在这里寻求帮助。
如果你能帮我纠正这条路,我将不胜感激
//环境:Envelope/env:Body/cdtBusinessData/文档
更新
This is what I came up with based on your suggestions.I'm using
jxpath
1.3. What am I doing wrong here ? I have comments inline next to the sysouts to indicate what I get
package com.testbed;
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.jxpath.JXPathContext;
import com.xyz.ib.pb.dtcc.util.FileUtils;
public class TestJXPathApproach {
public static void main(String a[]) throws Exception {
String xmlMsg = FileUtils.readFileContents("C:\dtcc-stuff\SR\1.xml");
//xmlMsg = StringUtils.remove(xmlMsg, "<?xml version=\"1.0\"?>");
TestJXPathApproach myTest = new TestJXPathApproach();
myTest.testJxPathExpressions(xmlMsg);
}
private void testJxPathExpressions(String xmlMsg) {
org.w3c.dom.Document doc = null;
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
ByteArrayInputStream bais = new ByteArrayInputStream(xmlMsg.getBytes("UTF8"));
doc = builder.parse(bais);
bais.close();
JXPathContext context = JXPathContext.newContext(doc);
context.setLenient(true);
context.registerNamespace("d", "urn:swift:xsd:seev.031.002.05");
context.registerNamespace("dd", "urn:swift:xsd:supl.001.001.05");
String cdtddTrackingNumVal = (String)context.getValue("/env:Envelope/env:Body/cdtDataDescription/cdtddTrackingNum");
System.out.println("cdtddTrackingNumVal : "+cdtddTrackingNumVal); // prints the value correctly
String cdVal = (String)context.getValue("/env:Envelope/env:Body/cdtBusinessData/d:Document/CorpActnNtfctn/CorpActnGnlInf/EvtTp/Cd");
System.out.println("cdVal : "+cdVal);// prints null with namespace mappping specified
cdVal = (String)context.getValue("/env:Envelope/env:Body/cdtBusinessData/Document/CorpActnNtfctn/CorpActnGnlInf/EvtTp/Cd");
System.out.println("cdVal : "+cdVal);// prints null with no namespace mapping
cdVal = (String)context.getValue("/env:Envelope/env:Body/cdtBusinessData/*:Document/CorpActnNtfctn/CorpActnGnlInf/EvtTp/Cd");
System.out.println("cdVal : "+cdVal);// prints null with wildcard namespace mapping
Object nodeObj = context.selectSingleNode("/env:Envelope/env:Body/cdtBusinessData/d:Document/CorpActnNtfctn");
System.out.println("nodeObj : "+nodeObj);// prints null
}catch(Exception e) {
e.printStackTrace();
}
}
}
如果您 registered 在 JXPath 中有以下命名空间前缀,
JXPathContext.registerNamespace("sw", "urn:swift:xsd:seev.031.002.05")
JXPathContext.registerNamespace("env", "CDTS-SUBMIT")
然后是下面的XPath,
/env:Envelope/env:Body/cdtBusinessData/sw:Document
将 select urn:swift:xsd:seev.031.002.05
命名空间中的 Document
元素成功。
更新
如果您想 select 一个 Document
元素在不同的命名空间中,类似地为新命名空间注册一个前缀并在您的 XPath 中使用它。
通常首选使用已注册的命名空间前缀,但如果您想忽略命名空间,在 XPath 2.0 中您可以使用*:Document
技术 .
在 XPath 1.0 中,*:
技术将不起作用,但您可以针对元素的本地名称进行测试:
//*[local-name() = 'Document']
将 select 所有 Document
元素,无论命名空间如何(也无论继承如何)。
对文档使用 命名空间通配符 ,如果您希望能够 select 任一:
/env:Envelope/env:Body/cdtBusinessData/*:Document
...或者,在一个查询中获取两个文档:
//*:Document
查看完整的 XQuery 文档,您可以 运行 自己查看它在 https://gist.github.com/charles-dyfis-net/983d4054f4f9424a1698
上的工作情况
以上与 XPath 1.0 兼容的版本 ():
/env:Envelope/env:Body/cdtBusinessData/*[local-name()='Document']
...或...
//*[local-name() = 'Document']
我需要一些帮助来想出一个正确的 XPath 表达式来从 XML.
中提取值我可以使用 jaxb 获取值,但是我需要 xpath,因为我有一个决定 table 我想要外部化的映射规则,如果我使用 jaxb 会导致很多嵌套 if/else 我想避免的语句,因此需要 xpath 方法。
我有一个 xml 文件,该文件至少由 4 个模式构成。我的意思是根模式在特定点有一个元素,上面写着 xs:any 并且在这个位置注入了一个基于不同模式的 xml 并且这反过来有一个类似的 xs:any 另一个xml 被注入以构建我使用的 final/actual xml。
这是我正在处理的实际 XML 结构(我有意修改了值)。下面 xml 中的两个文档节点基于不同的架构
<?xml version="1.0"?>
<env:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="CDTS-SUBMIT">
<env:Body>
<cdtPrefix>
<cdtprVersion>01</cdtprVersion>
<cdtprOperation>SUBMIT</cdtprOperation>
<cdtprFunction>GCAMS1O</cdtprFunction>
<cdtprDirectionFlag>O</cdtprDirectionFlag>
</cdtPrefix>
<cdtDataDescription>
<cdtddVersion>01</cdtddVersion>
<cdtddFirmId>ABC</cdtddFirmId>
<cdtddBusinessDataFormat>GCAMS1O-XML</cdtddBusinessDataFormat>
<cdtddReferenceNum>123</cdtddReferenceNum>
<cdtddTrackingNum>123</cdtddTrackingNum>
<cdtddDestination>AQ</cdtddDestination>
<cdtddSeqNum>0000000</cdtddSeqNum>
<cdtddCycleNum>00</cdtddCycleNum>
<cdtddBusinessDate>00000000</cdtddBusinessDate>
</cdtDataDescription>
<cdtBusinessData>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Fr>
<FIId>
<FinInstnId>
<BICFI>ABC</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>ABC </BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>ABC</BizMsgIdr>
<MsgDefIdr>seev.031.002.05</MsgDefIdr>
<BizSvc>CSD</BizSvc>
<CreDt>9999-99-99T00:02:17Z</CreDt>
</AppHdr>
<Document xmlns="urn:swift:xsd:seev.031.002.05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CorpActnNtfctn>
<NtfctnGnlInf>
<NtfctnTp>REPL</NtfctnTp>
<PrcgSts>
<Cd>
<EvtCmpltnsSts>COMP</EvtCmpltnsSts>
<EvtConfSts>CONF</EvtConfSts>
</Cd>
</PrcgSts>
</NtfctnGnlInf>
<PrvsNtfctnId>
<Id>00000000</Id>
</PrvsNtfctnId>
<EvtsLkg>
<EvtId>
<LkdOffclCorpActnEvtId>US8</LkdOffclCorpActnEvtId>
</EvtId>
<LkgTp>
<Cd>INFO</Cd>
</LkgTp>
</EvtsLkg>
<CorpActnGnlInf>
<CorpActnEvtId>000</CorpActnEvtId>
<OffclCorpActnEvtId>US7</OffclCorpActnEvtId>
<EvtPrcgTp>
<Cd>DISN</Cd>
</EvtPrcgTp>
<EvtTp>
<Cd>INTR</Cd>
</EvtTp>
<MndtryVlntryEvtTp>
<Cd>CHOS</Cd>
</MndtryVlntryEvtTp>
<UndrlygScty>
<FinInstrmId>
<OthrId>
<Id>J54675AA1</Id>
<Tp>
<Cd>CUSP</Cd>
</Tp>
</OthrId>
<Desc>JASDFKASDFADSFAFADSF</Desc>
</FinInstrmId>
<ClssfctnTp>
<ClssfctnFinInstrm>DBXXXX</ClssfctnFinInstrm>
</ClssfctnTp>
</UndrlygScty>
</CorpActnGnlInf>
<AcctDtls>
<ForAllAccts>
<IdCd>GENR</IdCd>
</ForAllAccts>
</AcctDtls>
<CorpActnDtls>
<DtDtls>
<RcrdDt>
<Dt>
<Dt>0000-04-03</Dt>
</Dt>
</RcrdDt>
</DtDtls>
<RateAndAmtDtls>
<Intrst>
<Rate>0</Rate>
</Intrst>
</RateAndAmtDtls>
<IntrstAcrdNbOfDays>0</IntrstAcrdNbOfDays>
</CorpActnDtls>
<CorpActnOptnDtls>
<OptnNb>001</OptnNb>
<OptnTp>
<Cd>CASH</Cd>
</OptnTp>
<DfltPrcgOrStgInstr>
<DfltOptnInd>true</DfltOptnInd>
</DfltPrcgOrStgInstr>
<DtDtls>
<RspnDdln>
<Dt>
<DtTm>0000-04-10T20:00:00-04:00</DtTm>
</Dt>
</RspnDdln>
</DtDtls>
<PrdDtls>
<ActnPrd>
<Prd>
<StartDt>
<Dt>
<DtTm>0000-04-06T00:00:00-04:00</DtTm>
</Dt>
</StartDt>
<EndDt>
<NotSpcfdDt>UKWN</NotSpcfdDt>
</EndDt>
</Prd>
</ActnPrd>
</PrdDtls>
<CshMvmntDtls>
<CdtDbtInd>CRDT</CdtDbtInd>
<IncmTp>
<Id>0004</Id>
<Issr>IRSX</Issr>
</IncmTp>
<DtDtls>
<PmtDt>
<Dt>
<Dt>0000-04-18</Dt>
</Dt>
</PmtDt>
</DtDtls>
<RateAndAmtDtls>
<IntrstRateUsdForPmt>
<RateTpAndAmtAndRateSts>
<RateTp>
<Cd>SCHD</Cd>
</RateTp>
<Amt Ccy="USD">21.17125</Amt>
</RateTpAndAmtAndRateSts>
</IntrstRateUsdForPmt>
<WhldgOfLclTax>
<Rate>15.315</Rate>
</WhldgOfLclTax>
</RateAndAmtDtls>
</CshMvmntDtls>
</CorpActnOptnDtls>
<CorpActnOptnDtls>
<OptnNb>002</OptnNb>
<OptnTp>
<Cd>CASH</Cd>
</OptnTp>
<OptnFeatrs>
<Cd>ASVO</Cd>
</OptnFeatrs>
<DfltPrcgOrStgInstr>
<DfltOptnInd>false</DfltOptnInd>
</DfltPrcgOrStgInstr>
<DtDtls>
<RspnDdln>
<Dt>
<DtTm>0000-04-10T20:00:00-04:00</DtTm>
</Dt>
</RspnDdln>
</DtDtls>
<PrdDtls>
<ActnPrd>
<Prd>
<StartDt>
<Dt>
<DtTm>0000-04-06T00:00:00-04:00</DtTm>
</Dt>
</StartDt>
<EndDt>
<NotSpcfdDt>UKWN</NotSpcfdDt>
</EndDt>
</Prd>
</ActnPrd>
</PrdDtls>
<CshMvmntDtls>
<CdtDbtInd>CRDT</CdtDbtInd>
<IncmTp>
<Id>0004</Id>
<Issr>IRSX</Issr>
</IncmTp>
<DtDtls>
<PmtDt>
<Dt>
<Dt>0000-04-18</Dt>
</Dt>
</PmtDt>
</DtDtls>
<RateAndAmtDtls>
<IntrstRateUsdForPmt>
<RateTpAndAmtAndRateSts>
<RateTp>
<Cd>SCHD</Cd>
</RateTp>
<Amt Ccy="USD">25</Amt>
</RateTpAndAmtAndRateSts>
</IntrstRateUsdForPmt>
<WhldgOfLclTax>
<Rate>0</Rate>
</WhldgOfLclTax>
</RateAndAmtDtls>
</CshMvmntDtls>
</CorpActnOptnDtls>
<AddtlInf>
<AddtlTxt>
<UpdDt>0000-04-04</UpdDt>
<AddtlInf> adfafadfasdfasdfasdfsdafadfdsafdf</AddtlInf>
</AddtlTxt>
</AddtlInf>
<Regar>
<NmAndAdr>
<Nm>Not Available</Nm>
</NmAndAdr>
</Regar>
<SplmtryData>
<Envlp>
<Document xmlns="urn:swift:xsd:supl.001.001.05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DTCCCANOCSDDataSD1>
<NtfctnGnlInf>
<PlcAndNm>/Document/CorpActnNtfctn/NtfctnGnlInf</PlcAndNm>
<CretDtAndTm>0000-04-24T11:34:09</CretDtAndTm>
<UpdDtAndTm>0000-04-24T20:02:16</UpdDtAndTm>
</NtfctnGnlInf>
<CorpActnGnlInf>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnGnlInf</PlcAndNm>
<EDSMsggElgbltyFlg>true</EDSMsggElgbltyFlg>
<DTCFCPElctnFlg>false</DTCFCPElctnFlg>
<AsstSvcrPrcgFlg>true</AsstSvcrPrcgFlg>
</CorpActnGnlInf>
<UndrlygScty>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnGnlInf/UndrlygScty</PlcAndNm>
<CtryOfListg>DE</CtryOfListg>
<IncmSrcCtry>JP</IncmSrcCtry>
<DTCAsstClss>CRPB</DTCAsstClss>
<DTCAsstTp>S500</DTCAsstTp>
</UndrlygScty>
<CorpActnDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnDtls</PlcAndNm>
<CutOffDays>0</CutOffDays>
<EDSMsggCtryCd>JP</EDSMsggCtryCd>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</CorpActnDtls>
<CorpActnDtDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnDtls/DtDtls</PlcAndNm>
<DTCPosCaptrDt>0000-04-03</DTCPosCaptrDt>
</CorpActnDtDtls>
<OptnDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[1]</PlcAndNm>
<XtndedOptnFeatrs>FORU</XtndedOptnFeatrs>
<DfltOptnFlg>true</DfltOptnFlg>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</OptnDtls>
<OptnDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[2]</PlcAndNm>
<XtndedOptnFeatrs>FORX</XtndedOptnFeatrs>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</OptnDtls>
<CshMvmntDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[1]/CshMvmntDtls[1]</PlcAndNm>
<DTCPayMtd>1</DTCPayMtd>
<DTCPayOrdr>0</DTCPayOrdr>
<NRATaxRptblFlg>false</NRATaxRptblFlg>
<DclrdGrssRate>
<AmtPricPerFinInstrmQty>
<AmtPricTp>ACTU</AmtPricTp>
<PricVal Ccy="USD">25</PricVal>
<FinInstrmQty>
<FaceAmt>1000</FaceAmt>
</FinInstrmQty>
</AmtPricPerFinInstrmQty>
</DclrdGrssRate>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</CshMvmntDtls>
<CshMvmntDtls>
<PlcAndNm>/Document/CorpActnNtfctn/CorpActnOptnDtls[2]/CshMvmntDtls[1]</PlcAndNm>
<DTCPayMtd>1</DTCPayMtd>
<DTCPayOrdr>0</DTCPayOrdr>
<NRATaxRptblFlg>false</NRATaxRptblFlg>
<RDPRefNb>yyyyyyJ54675xxxxxxxxxxxxxxxxxxxx</RDPRefNb>
</CshMvmntDtls>
<Agt>
<PlcAndNm>/Document/CorpActnNtfctn/Regar/NmAndAdr</PlcAndNm>
<AgtId>00009910</AgtId>
</Agt>
</DTCCCANOCSDDataSD1>
</Document>
</Envlp>
</SplmtryData>
</CorpActnNtfctn>
</Document>
</cdtBusinessData>
</env:Body>
</env:Envelope>
我提取前几个元素没问题 像 /env:Envelope/env:Body/cdtBusinessData
cdtBusinessData 是主模式中采用 xs:any 的元素 .架构片段如下
<xs:element name="cdtBusinessData" form="unqualified">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
正是从这一点开始,我的 xpath 查询无法按照我期望的方式工作。
即 当我尝试 /env:Envelope/env:Body/cdtBusinessData/Document 时,它无法将其识别为 jxpath 上的正确路径。 在为选定节点提供 xpath(如 xpather/firepath/XpathBuilder)的不同工具上,我得到不同的值,none 其中 xpath 接受。
能否请您帮助我理解如何从上面的两个嵌入式节点中提取值 xml。
我已经为此苦苦挣扎了一段时间,终于在这里寻求帮助。 如果你能帮我纠正这条路,我将不胜感激 //环境:Envelope/env:Body/cdtBusinessData/文档
更新
This is what I came up with based on your suggestions.I'm using jxpath 1.3. What am I doing wrong here ? I have comments inline next to the sysouts to indicate what I get
package com.testbed;
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.jxpath.JXPathContext;
import com.xyz.ib.pb.dtcc.util.FileUtils;
public class TestJXPathApproach {
public static void main(String a[]) throws Exception {
String xmlMsg = FileUtils.readFileContents("C:\dtcc-stuff\SR\1.xml");
//xmlMsg = StringUtils.remove(xmlMsg, "<?xml version=\"1.0\"?>");
TestJXPathApproach myTest = new TestJXPathApproach();
myTest.testJxPathExpressions(xmlMsg);
}
private void testJxPathExpressions(String xmlMsg) {
org.w3c.dom.Document doc = null;
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
ByteArrayInputStream bais = new ByteArrayInputStream(xmlMsg.getBytes("UTF8"));
doc = builder.parse(bais);
bais.close();
JXPathContext context = JXPathContext.newContext(doc);
context.setLenient(true);
context.registerNamespace("d", "urn:swift:xsd:seev.031.002.05");
context.registerNamespace("dd", "urn:swift:xsd:supl.001.001.05");
String cdtddTrackingNumVal = (String)context.getValue("/env:Envelope/env:Body/cdtDataDescription/cdtddTrackingNum");
System.out.println("cdtddTrackingNumVal : "+cdtddTrackingNumVal); // prints the value correctly
String cdVal = (String)context.getValue("/env:Envelope/env:Body/cdtBusinessData/d:Document/CorpActnNtfctn/CorpActnGnlInf/EvtTp/Cd");
System.out.println("cdVal : "+cdVal);// prints null with namespace mappping specified
cdVal = (String)context.getValue("/env:Envelope/env:Body/cdtBusinessData/Document/CorpActnNtfctn/CorpActnGnlInf/EvtTp/Cd");
System.out.println("cdVal : "+cdVal);// prints null with no namespace mapping
cdVal = (String)context.getValue("/env:Envelope/env:Body/cdtBusinessData/*:Document/CorpActnNtfctn/CorpActnGnlInf/EvtTp/Cd");
System.out.println("cdVal : "+cdVal);// prints null with wildcard namespace mapping
Object nodeObj = context.selectSingleNode("/env:Envelope/env:Body/cdtBusinessData/d:Document/CorpActnNtfctn");
System.out.println("nodeObj : "+nodeObj);// prints null
}catch(Exception e) {
e.printStackTrace();
}
}
}
如果您 registered 在 JXPath 中有以下命名空间前缀,
JXPathContext.registerNamespace("sw", "urn:swift:xsd:seev.031.002.05")
JXPathContext.registerNamespace("env", "CDTS-SUBMIT")
然后是下面的XPath,
/env:Envelope/env:Body/cdtBusinessData/sw:Document
将 select urn:swift:xsd:seev.031.002.05
命名空间中的 Document
元素成功。
更新
如果您想 select 一个 Document
元素在不同的命名空间中,类似地为新命名空间注册一个前缀并在您的 XPath 中使用它。
通常首选使用已注册的命名空间前缀,但如果您想忽略命名空间,在 XPath 2.0 中您可以使用*:Document
技术
在 XPath 1.0 中,*:
技术将不起作用,但您可以针对元素的本地名称进行测试:
//*[local-name() = 'Document']
将 select 所有 Document
元素,无论命名空间如何(也无论继承如何)。
对文档使用 命名空间通配符 ,如果您希望能够 select 任一:
/env:Envelope/env:Body/cdtBusinessData/*:Document
...或者,在一个查询中获取两个文档:
//*:Document
查看完整的 XQuery 文档,您可以 运行 自己查看它在 https://gist.github.com/charles-dyfis-net/983d4054f4f9424a1698
上的工作情况以上与 XPath 1.0 兼容的版本 (
/env:Envelope/env:Body/cdtBusinessData/*[local-name()='Document']
...或...
//*[local-name() = 'Document']