如何使用java代码迭代xml节点

如何使用java代码迭代xml节点,java,xml,Java,Xml,我应该检查是否可以在任何XML中包含它,这里是最后一个XML。如果存在,我应该再次从第一个开始循环,以检查是否包含 xml如下所示: <Transaction> <LineItem> <Return></Return> </LineItem> <LineItem> <Return></Return> </LineItem>

我应该检查是否可以在任何XML中包含它,这里是最后一个XML。如果存在,我应该再次从第一个开始循环,以检查是否包含

xml如下所示:

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