读取具有多个子节点的xml文件

时间:2014-03-13 07:35:21

标签: java xml solr xml-parsing

考虑我有一个XML文件,如下面的xml文件。

<top>
    <CRAWL>
        <NAME>div[class=name],attr=0</NAME>
        <PRICE>span[class~=(?i)(price-new|price-old)],attr=0</PRICE>
        <DESC>div[class~=(?i)(sttl dyn|bin)],attr=0</DESC>
        <PROD_IMG>div[class=image]>a>img,attr=src</PROD_IMG>
        <URL>div[class=name]>a,attr=href</URL>
    </CRAWL>
    <CRAWL>
        <NAME>img[class=img],attr=alt</NAME>
        <PRICE>div[class=g-b],attr=0</PRICE>
        <DESC>div[class~=(?i)(sttl dyn|bin)],attr=0</DESC>
        <PROD_IMG>img[itemprop=image],attr=src</PROD_IMG>
        <URL>a[class=img],attr=href</URL>
    </CRAWL>
</top>

我想要的是首先获取所有的值,在完成第一个操作后转到下一个并重复它,即使我有两个以上的标签。如果只有一个可用,我设法获得。使用标签内的值我正在做一些其他功能。在每个它有不同的值,我使用该值进行不同的操作。除了我不知道如何在xml文件中循环获取之外的其他一切。

问候

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这一点,您就会尝试从XML片段中存在的所有标记中提取数据。有多种解决方案。我在下面列出了它们:

  1. XPath:如果您确切知道XML结构是什么,可以为每个节点使用XPath = CRAWL来查找标签内的数据:

    // Instantiate XPath variable
    XPath xpath = XPathFactory.newInstance().newXPath();
    // Define the exact XPath expressions you want to get data for:
    XPathExpression name     = xpath.compile("//top/CRAWL/NAME/text()");
    XPathExpression price    = xpath.compile("//top/CRAWL/PRICE/text()");
    XPathExpression desc     = xpath.compile("//top/CRAWL/DESC/text()");
    XPathExpression prod_img = xpath.compile("//top/CRAWL/PROD_IMG/text()");
    XPathExpression url      = xpath.compile("//top/CRAWL/URL/text()");
    
  2. 此时,上述每个变量都将包含每个标签的数据。您可以将其放入一个数组中,每个数组都包含所有元素中每个标记的所有数据。

    1. 另一个(更有效的解决方案)是通过基于DOM的解析来存储数据:

      // Instantiate the doc builder
      DocumentBuilder xmlDocBuilder = domFactory.newDocumentBuilder();
      Document xmlDoc               = xmlDocBuilder.parse("xmlFile.xml");
      // Create NodeList of element tag "CRAWL"
      NodeList crawlNodeList = xmlDoc.getElementsByTagName("CRAWL");
      // Now iterate through each item in the NodeList and get the values of 
      // each of the elements in Name, Price, Desc etc.
      for (Node node: crawlNodeList) {
           NamedNodeMap subNodeMap = node.getChildNodes();
           int currentNodeMapLength = subNodeMap.getLength();
      
           // Get each node's name and value
           for (i=0; i<currentNodeMapLength; i++){
                // Iterate through all of the values in the nodeList, 
                // e.g. NAME, PRICE, DESC, etc.
                // Do something with these values
           }
      }
      
    2. 希望这有帮助!