如何使用XPATH访问特定的子节点? [重复]

问题描述 投票:2回答:2

这个问题在这里已有答案:

我有一个XML文件,我正在尝试解析以获取名为Result的标签。

使用xpath name(//results/*)count(//results/*),我可以看到results有10个子节点,每个节点都被命名为Result。但如果我使用以下任何xpath,则无法匹配:

  • //Result
  • /query/results/Result[1]
  • /query/results/Result

我正在做的是返回任何Result标签。但我知道有10个。我可以通过results获得/query/results,所以我知道我正在连接到这个文件。如何生成xpath以到达每个Result

XML结构(缩写):

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
    yahoo:count="10" yahoo:created="2013-07-17T15:15:52Z" yahoo:lang="en-US">
    <diagnostics>
    </diagnostics> 
    <results>
        <Result id="11762112" xmlns="urn:yahoo:lcl">
            <Title>California Rollin' Sushi Bar</Title>
            <Address>274 Goodman St N</Address>
            <City>Rochester</City>
            <State>NY</State>
            <Phone>(585) 271-8990</Phone>
            <Latitude>43.158685</Latitude>
            <Longitude>-77.585197</Longitude>
            <Rating>
                <AverageRating>3</AverageRating>
                <TotalRatings>10</TotalRatings>
                <TotalReviews>10</TotalReviews>
                <LastReviewDate>1341259499</LastReviewDate>
                <LastReviewIntro> I went with my two girls last week and was told it would be around 1-1/2 wait so we had our name put on list hoping we would get seated sooner. It was busy because the groupons were expiring (which they knew ahead of time, so one would think they would be prepared). Well needless to say after 1-1/2 we still were not seated and there were several tables available. I asked how much longer and the hostess said another hour. I told her we have already been waiting for 1 hour she smirked and said sorry. People were coming in after us and being seated which made one of my girls ask the question why do they get a table before us. I went back in and said since my kids are tired is there anyway I could order take out and use my groupon since I am here and of course the hostess replied no its for dine in only. Ugh we left and ate elsewhere. I did call to speak with the manager who really was more concerned about telling me how proud she was of her staff and really didnt seem to care about our awful experience. Too bad because they lost several customers that night. What ever happend to customer service?</LastReviewIntro>
            </Rating>
            <Distance>1.57</Distance>
            <Url>http://local.yahoo.com/info-11762112-california-rollin-sushi-bar-rochester</Url>
            <ClickUrl>http://local.yahoo.com/info-11762112-california-rollin-sushi-bar-rochester</ClickUrl>
            <MapUrl>http://local.yahoo.com/info-11762112-california-rollin-sushi-bar-rochester?viewtype=map</MapUrl>
            <BusinessUrl>http://californiarollin.com/</BusinessUrl>
            <BusinessClickUrl>http://californiarollin.com/</BusinessClickUrl>
            <Categories>
                <Category id="96926236">Restaurants</Category>
                <Category id="96926205">Sushi Restaurants</Category>
            </Categories>
        </Result>
    </results>
</query>
java xml xpath
2个回答
0
投票

元素结果属于默认命名空间“urn:yahoo:lcl”。查看问题的答案:

Getting elements with default namespace (no namespace prefix) using XPath


0
投票

我已经尝试过你的xml并且必须关闭results标签,我认为这是你复制和粘贴xml的一部分。除此之外,一切都很好。我添加了更多的Result标签来测试它并得到了预期的结果。看看这个:

import java.io.FileInputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestXpath {
    public static void main(String[] args) throws IOException, SAXException, IOException, ParserConfigurationException, XPathExpressionException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document parse = builder.parse(new FileInputStream("test.xml"));

        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();
        XPathExpression expr = xpath.compile("/query/results/Result[2]");

        NodeList nl = (NodeList)  expr.evaluate(parse, XPathConstants.NODESET);
        for (int i = 0; i < nl.getLength(); i++) {
            Node item = nl.item(i);
            System.out.println(item.getNodeName());
            System.out.println(item.getTextContent());
        }
    }
}

输出:

Result

            California  2 Rollin' Sushi Bar
            274 Goodman St N
            Rochester
            NY
            (585) 271-8990
            43.158685
            -77.585197

                3
                10
                10
                1341259499
                 I went with my two girls last week and was told it would be around 1-1/2 wait so we had our name put on list hoping we would get seated sooner. It was busy because the groupons were expiring (which they knew ahead of time, so one would think they would be prepared). Well needless to say after 1-1/2 we still were not seated and there were several tables available. I asked how much longer and the hostess said another hour. I told her we have already been waiting for 1 hour she smirked and said sorry. People were coming in after us and being seated which made one of my girls ask the question why do they get a table before us. I went back in and said since my kids are tired is there anyway I could order take out and use my groupon since I am here and of course the hostess replied no its for dine in only. Ugh we left and ate elsewhere. I did call to speak with the manager who really was more concerned about telling me how proud she was of her staff and really didnt seem to care about our awful experience. Too bad because they lost several customers that night. What ever happend to customer service?

            1.57
            http://local.yahoo.com/info-11762112-california-rollin-sushi-bar-rochester
            http://local.yahoo.com/info-11762112-california-rollin-sushi-bar-rochester
            http://local.yahoo.com/info-11762112-california-rollin-sushi-bar-rochester?viewtype=map
            http://californiarollin.com/
            http://californiarollin.com/

                Restaurants
                Sushi Restaurants

注意California 2表明它是第二个Result条目。

我也尝试过//Result/query/results/Result

你手头的xml有什么问题吗?你能用我发布的代码试试吗?干杯!

© www.soinside.com 2019 - 2024. All rights reserved.