如何使用java代码迭代xml节点
我应该检查是否可以在任何XML中包含它,这里是最后一个XML。如果存在,我应该再次从第一个开始循环,以检查是否包含 xml如下所示:如何使用java代码迭代xml节点,java,xml,Java,Xml,我应该检查是否可以在任何XML中包含它,这里是最后一个XML。如果存在,我应该再次从第一个开始循环,以检查是否包含 xml如下所示: <Transaction> <LineItem> <Return></Return> </LineItem> <LineItem> <Return></Return> </LineItem>
<Transaction>
<LineItem>
<Return></Return>
</LineItem>
<LineItem>
<Return></Return>
</LineItem>
<LineItem>
<Return></Return>
</LineItem>
<LineItem>
<Return></Return>
</LineItem>
<LineItem>
<Tender></Tender>
</LineItem>
</Transaction>
如何迭代XML和检查,以及如何从开始到检查进行迭代
我只实现了我提供的代码片段,因为它是巨大的
//Tender Type
Lineitems = retailChildren.item(j).getChildNodes();
for(int i2=0;i2<Lineitems.getLength();i2++)
{
if(Lineitems.item(i2).getNodeName().equalsIgnoreCase("Tender")){
System.out.println("Inside Tender");
//start
NodeList TenderId=Lineitems.item(i2).getChildNodes();
TenderId=Lineitems.item(i2).getChildNodes();
for(int i4=0;i4<TenderId.getLength();i4++){
if(TenderId.item(i4).getNodeName().equalsIgnoreCase("TenderID")){
System.out.println("Inside Tender ID");
String TenderID=TenderId.item(i4).getFirstChild().getNodeValue();
System.out
.println(TenderID);
NodeList SaleType=TenderId.item(i2).getChildNodes();
//SaleType=TenderId.item(i2).getChildNodes();
for(int i3=0;i3<SaleType.getLength();i3++){
if(SaleType.item(i3).getNodeName().equalsIgnoreCase("bby:SaleTenderType")){
System.out.println("Inside Sale Tender Type");
String eCommValue=SaleType.item(i3).getFirstChild().getNodeValue();
if(eCommValue.equalsIgnoreCase("Magento")){
System.out.println("Inside Magento");
Lineitems = retailChildren.item(j).getChildNodes();
for (int i1 = 0; i1 < Lineitems.getLength(); i1++) {
if(Lineitems.item(i1).getNodeName().equalsIgnoreCase("Return")){
//Do method
}
}
}
}
}
}
}
}
// If <Tender> is not present, it should come here
else
{
Lineitems = retailChildren.item(j).getChildNodes();
for (int i1 = 0; i1 < Lineitems.getLength(); i1++) {
if(Lineitems.item(i1).getNodeName().equalsIgnoreCase("Return")){
//do method
}
}
}//End for for tender type
}
可以使用XPATH从xml获取节点 XPath是XML路径语言,是一种用于从XML文档中选择节点的查询语言。此外,XPath还可用于计算XML文档内容中的值,例如字符串、数字或布尔值 您的XPath表达式将是
/Transaction/LineItem/Return
boolean(/Transaction/LineItem/Tender)
我假设您将xml作为字符串,因此需要以下想法
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource inputSource = new InputSource(new StringReader(xml));
Document document = builder.parse(inputSource);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
您首先必须检查节点是否存在于
Boolean hasTender = (Boolean) expr.evaluate(document, XPathConstants.BOOLEAN);
用户只需查找返回节点
现在,它将简单地通过每个节点进行循环
for (int i = 0; i < nl.getLength(); i++)
{
System.out.println(nl.item(i).getNodeName());
}
简而言之,下面的代码。。请记住,您希望将其分解为可重用的方法
控制器测试
改用XPath
XPathFactory xpf = XPathFactory.newInstance();
XPath path = xpf.newXPath();
XPathExpression tenderExpr = path.compile("/Transaction//LineItem/Tender");
NodeList tenderNodes = (NodeList)tenderExpr.evaluate(document, XPathConstants.NODESET);
if (tenderNodes.getLength() > 0) {
// tender was found
} else {
XPathExpression returnExpr = path.compile("/Transaction//LineItem/Return");
NodeList returnNodes = (NodeList)returnExpr.evaluate(document, XPathConstants.NODESET);
// returnNodes has all the elements you wanted, iterate that and see what you can see
}
@JPMoresmau-包含代码。我使用的是DOM parserdo,您是否只需要一份投标清单和一份退货清单?我想您可能会发现,使用xpath解决这个问题要容易得多。@KennethClark-首先我想检查是否有。。如果存在,我应该阅读交易中存在的投标书,然后阅读所有返回节点?我对此进行投票,因为它比我的答案更详细。谢谢。。我不能迭代for循环吗?迭代上面的for循环就是每个返回节点。你可以加上你的逻辑你确定吗?因为从1.5版开始,这里使用的所有类都是标准JavaSE工具包的一部分。如果SAP允许您使用NodeList而不是XPathFactory,我会非常惊讶的谢谢。。这会奏效的。但我必须阅读投标书中的每一个节点。。我还没有提供完整的代码/xml evaluate返回的节点列表与您在示例代码中使用的类型相同,它只包含与路径匹配的节点。它只是减少了找东西的工作量。如果需要处理其中的每个节点,仍然可以获取childNodes。或者,您可以考虑另一组XPATH表达式来更容易地找到您关心的其他部分。可能性是无穷的。
public class Controller {
public static void main(String[] args) throws XPathExpressionException, IOException, SAXException, ParserConfigurationException {
String xml ="<Transaction>\n" +
" <LineItem>\n" +
" <Return></Return>\n" +
" </LineItem>\n" +
" <LineItem>\n" +
" <Return></Return>\n" +
" </LineItem>\n" +
" <LineItem>\n" +
" <Return></Return>\n" +
" </LineItem>\n" +
" <LineItem>\n" +
" <Return></Return>\n" +
" </LineItem>\n" +
" <LineItem>\n" +
" <Tender></Tender>\n" +
" </LineItem>\n" +
"</Transaction>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource inputSource = new InputSource(new StringReader(xml));
Document document = builder.parse(inputSource);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("boolean(/Transaction/LineItem/Tender)");
Boolean hasTender = (Boolean) expr.evaluate(document, XPathConstants.BOOLEAN);
if (hasTender)
{
XPathExpression exprResult = xpath.compile("/Transaction/LineItem/Return");
NodeList nl = (NodeList) exprResult.evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength(); i++)
{
System.out.println(nl.item(i).getNodeName());
}
}
}
}
XPathFactory xpf = XPathFactory.newInstance();
XPath path = xpf.newXPath();
XPathExpression tenderExpr = path.compile("/Transaction//LineItem/Tender");
NodeList tenderNodes = (NodeList)tenderExpr.evaluate(document, XPathConstants.NODESET);
if (tenderNodes.getLength() > 0) {
// tender was found
} else {
XPathExpression returnExpr = path.compile("/Transaction//LineItem/Return");
NodeList returnNodes = (NodeList)returnExpr.evaluate(document, XPathConstants.NODESET);
// returnNodes has all the elements you wanted, iterate that and see what you can see
}