使用多个相同的标签解析 XML

Parsing XML with multiple, identical tags

在添加任何其他内容之前,我想提一下,我已经查看了这里的其他答案。不幸的是,答案并不适用于我的情况,最好的答案只是提供了一些代码而没有实际回答任何问题。

我有 XML 个文件,其内容如下:

<TransactionLine status="normal">
 <ItemLine>
  <ItemCode>
   <POSCodeFormat format="upcA"></POSCodeFormat>
   <POSCode>074804007527</POSCode>
   <POSCodeModifier name="pc">1</POSCodeModifier>
  </ItemCode>
  <Description>EP  PK WINS EACH</Description>
  <EntryMethod method="scan"></EntryMethod>
  <ActualSalesPrice>2.99</ActualSalesPrice>
  <MerchandiseCode>1</MerchandiseCode>
  <SellingUnits>1</SellingUnits>
  <RegularSellPrice>2.99</RegularSellPrice>
  <SalesQuantity>1</SalesQuantity>
  <SalesAmount>2.99</SalesAmount>
  <ItemTax>
   <TaxLevelID>101</TaxLevelID>
  </ItemTax>
  <SalesRestriction>
   <SalesRestrictFlag value="no"  type="other"></SalesRestrictFlag>
  </SalesRestriction>
 </ItemLine>
</TransactionLine>
<TransactionLine status="normal">
<ItemLine>
<ItemCode>
 <POSCodeFormat format="upcA"></POSCodeFormat>
 <POSCode>030004344770</POSCode>
 <POSCodeModifier name="pc">1</POSCodeModifier>
</ItemCode>
<Description>MCRFBER TOW EACH</Description>
<EntryMethod method="scan"></EntryMethod>
<ActualSalesPrice>1</ActualSalesPrice>
<MerchandiseCode>1</MerchandiseCode>
<SellingUnits>1</SellingUnits>
<RegularSellPrice>1</RegularSellPrice>
<SalesQuantity>1</SalesQuantity>
<SalesAmount>1</SalesAmount>
<ItemTax>
 <TaxLevelID>101</TaxLevelID>
</ItemTax>
<SalesRestriction>
 <SalesRestrictFlag value="no"  type="other"></SalesRestrictFlag>
</SalesRestriction>
</ItemLine>
</TransactionLine>

一个给定的文件将有多个 "Transaction Lines"。它们之间的区别因素是 POS 代码。我的主要问题是,我如何深入到可以实际使用该区分值开始将信息投入必要对象的地步?在我走的时候简单地删除它们不是一种选择。我无法控制 XML 输出,所以我无法让它更有用。我使用 XStrem 作为 XML 解析器。 Java 中的解决方案更可取,但 Scala 也可以。

假定您的 xml 包含根节点,您可以使用 xpath 表达式来识别相关节点,例如:

//TransactionLine/ItemLine/ItemCode[POSCode=074804007527]/../..

使用 XStream 应该类似于

String idimlookingfor = "074804007527";

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

String xpathexpression = String.format("//TransactionLine/ItemLine/ItemCode[POSCode=%s]/../..", idimlookingfor);
XPathExpression expr = xpath.compile(xpathexpression);

Object result = expr.evaluate(document, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;