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

Java 读取具有多个子节点的xml文件,java,xml,solr,xml-parsing,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<

假设我有一个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>

div[class=name],attr=0
span[class=(?i)(新价格|旧价格)],属性=0
div[class=(?i)(sttl dyn | bin)],attr=0
div[class=image]>a>img,attr=src
div[class=name]>a,attr=href
img[class=img],attr=alt
div[class=g-b],attr=0
div[class=(?i)(sttl dyn | bin)],attr=0
img[itemprop=image],attr=src
a[class=img],attr=href
我想要的是首先获取所有的值,在完成第一个操作后,转到下一个并重复它,即使我有两个以上的标记。如果只有一个可用,我已经设法获取。使用标签中的值,我正在执行一些其他功能。在每种情况下,它都有不同的值,我将这些值用于不同的操作。如果一切正常,除了我不知道如何在xml文件中循环抓取之外


关于

如果我理解正确,那么您正试图从XML片段中存在的所有标记中提取数据。有多种解决方案。我将它们列在下面:

  • 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()");
    
  • 此时,上面的每个变量将包含每个标记的数据。您可以将其放入每个元素的数组中,在该数组中,您将拥有所有元素中每个标记的所有数据

  • 另一种(更有效的解决方案)是通过执行基于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
         }
    }
    
    //实例化文档生成器
    DocumentBuilder xmlDocBuilder=domFactory.newDocumentBuilder();
    文档xmlDoc=xmlDocBuilder.parse(“xmlFile.xml”);
    //创建元素标记“爬网”的节点列表
    NodeList crawlingnodelist=xmlDoc.getElementsByTagName(“爬网”);
    //现在迭代节点列表中的每个项,并获取
    //名称、价格、描述等中的每个元素。
    用于(节点:爬网节点列表){
    NamedNodeMap子NodeMap=node.getChildNodes();
    int currentNodeMapLength=subNodeMap.getLength();
    //获取每个节点的名称和值
    
    对于(i=0;我必须查看JAXB api示例-到目前为止您做了什么?您遇到了什么问题?向我们展示您需要帮助的地方。我正在获取值并对网站进行爬网。因此,我在xml标记中获得了用于爬网的HTML属性。当我使用多个url时,我希望使用多个HTML属性对ryt进行爬网?所以我想自动化它。现在我正在做的是使用不同的xml文件,并手动更改程序中的xml文件名以进行爬网。我想将所有站点的html属性设置为单个xml文件,并逐个读取。您的第二个解决方案(编号为1。顺便说一句),什么是类的domFactory?