2015-06-17 52 views
-1

我應該檢查<LineItem>是否包含<Tender> XML節點(這<Tender>可以在任何<LineItem>的,在這裏,在這個XML其去年<LineItem>)。如果<Tender>存在,我應該再次從第一個循環開始,檢查<LineItem>是否包含<Return>如何重複使用Java代碼

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>,再如何從開始遍歷檢查<Return>

我已經實現的(我只提供了代碼段,因爲它是巨大的)

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

    } 
+0

@ JPMoresmau--代碼included.I正在使用DOM解析器 –

+0

你只是想tender'和列表'列表返回? –

+1

我想你會發現用xpath解決這個問題更容易。 –

回答

1

您可以使用XPath

的XPath從XML節點,XML路徑語言,是一種用於從XML文檔中選擇節點的查詢語言。另外,XPath可用於從XML文檔的內容計算值(例如,字符串,數字或布爾值)。What is Xpath

你的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); 

只需查找Return否DES現在

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()); 
} 

簡而言之下面的代碼..記住要打入重用方法這一點。

控制器檢測

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()); 
     } 
    } 
    } 
} 
+1

我對此表示滿意,因爲它比我的回答更詳細。 –

+0

謝謝..我不能迭代循環。 –

+1

迭代上面的for循環是每個'Return'節點。所以你可以添加你的邏輯 –

1

使用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 
} 
+0

謝謝..但我必須將此代碼導出到SAP PI ..有XPATH將失敗.. –

+0

您確定嗎?因爲這裏使用的所有類都是自1.5版以來的標準JavaSE工具包的一部分。如果SAP允許你使用'NodeList'但是*不* * XPathFactory' –

+0

謝謝..這會起作用。但我必須閱讀'Tender'內的每個節點..我沒有提供完整的代碼/ xml –