我正在使用库(JXPath)来查询bean的图形以便提取匹配的元素.但是,JXPath返回匹配元素组作为java.lang.Iterator的实例,我更愿意将其转换为不可变的scala列表.有没有比在迭代器上迭代并在每个迭代步骤创建一个新的不可变列表更简单的方法?
我有一个简单的类(用于测试目的),我试图查询使用JXPath.
我创建了一个各种动物对象的列表,我想得到一个Iterator:
所有类型='CAT'的动物
所有动物,其中numLegs = 4
这是简单的类:
public class Animal {
private UUID uuid;
private int numLegs;
private AnimalType type;
public enum AnimalType {
CHICKEN, FROG, DOG, CAT
}
public Animal(AnimalType type) {
this.type = type;
uuid = UUID.randomUUID();
switch (type) {
case CHICKEN:
numLegs = 2;
break;
case FROG:
numLegs = 2;
break;
case DOG:
numLegs = 4;
break;
case CAT:
numLegs = 4;
break;
}
}
public UUID getUuid() {
return uuid;
}
public int getNumLegs() {
return …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来提出一个适当的XPath表达式来从XML中提取值.
我可以使用jaxb获取值,但是我需要xpath,因为我有一个决策表类型的映射规则,我想要外部化,如果我使用jaxb将导致很多嵌套的if/else语句,我想避免,因此需要xpath方法.
我有一个xml文件,至少有4个模式构建.我的意思是根模式在特定点有一个元素,表示xs:any,在这个位置注入一个基于不同模式的xml,这反过来又有一个类似的xs:any注入另一个xml来构建final /我使用的实际xml.
这是我正在处理的实际XML结构(我故意修改了值).下面xml中的两个Document节点基于不同的模式
<?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> …Run Code Online (Sandbox Code Playgroud) 我正在使用 apache JXPath 库来解析 XML。我试图在 JXPath 中找到一个 API,它的功能与 XPath 评估类似,即检查 xpath 表达式是否存在?它的相似之处在于
<xsl:when test="
Run Code Online (Sandbox Code Playgroud)
使用 xslt 时。使用 XPath 我可以类似地做
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
InputSource source = new InputSource(new StringReader(xml));
status = xpath.evaluate("/resp/status/solution", source);
Run Code Online (Sandbox Code Playgroud)
如果解决方案不存在,那么它会将状态返回为空。现在,在使用 JXPath 时,我无法在类似的行中找出 API。这是我的示例代码
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder bld = dbfactory.newDocumentBuilder();
文档 metaDoc = bld.parse(in);
JXPathContext metaCtx = JXPathContext.newContext(metaDoc);
节点 node = (Node)metaCtx.selectSingleNode("/resp/status/solution");
这将引发“JXPathNotFoundException:xpath 无值”。对于实现特定的逻辑,如果表达式不返回数据/不存在,我需要放置和 if-else 块。
任何关于此的指针将不胜感激。
谢谢