Извлечь несколько узлов, используя XPath - PullRequest
1 голос
/ 11 августа 2011

Я хотел бы использовать XPath для извлечения значения элемента "ImageUID" (т.е. {7f2535d0-9a41-4997-9694-0a4de569e6d9}) и значения элемента "URL128" (т.е. http://cachens.corbis.com/CorbisImage/thumb/15/53/42/15534232/42-15534232.jpg) из строки xmlкак показано ниже. Может быть несколько элементов «Image», хотя здесь есть только один. Приведенный ниже код извлекает только значение URL128, но мне также нужно получить соответствующий ImageUID, есть идеи?

String unescaped="<imagesXML><Images><Image><ImageUID Scope='Public' Type='Guid' Value='{7f2535d0-9a41-4997-9694-0a4de569e6d9}'/><CorbisID Scope='Public' Type='String' Value='42-15534232'/><Title Scope='Public' Type='String' Value='Animal'/><CreditLine Scope='Public' Type='String' Value='© Robert Llewellyn/Corbis'/><IsRoyaltyFree Scope='Public' Type='Boolean' Value='False'/><AspectRatio Scope='Public' Type='String' Value='1.500000'/><URL128 Scope='Public' Type='String' Value='http://cachens.corbis.com/CorbisImage/thumb/15/53/42/15534232/42-15534232.jpg'/></Image></Images></imagesXML>";

InputSource source = new InputSource(new StringReader(unescaped));
        XPath xPath = XPathFactory.newInstance().newXPath();
        NodeList list = null;
        try
        {
            SimpleNamespaceContext nsCtx = new SimpleNamespaceContext();
            nsCtx.bindNamespaceUri("ns", "http://c1.net.corbis.com/");
            xPath.setNamespaceContext(nsCtx);
            list = (NodeList) xPath.evaluate("//ns:URL128/@Value", source, XPathConstants.NODESET);
        } catch (Exception ex)
        {
            log.error(ex.getMessage());
        }
        List<String> imageURLs = new ArrayList<String>();
        for (int i = 0; i < list.getLength(); i++)
        {
            imageURLs.add(list.item(i).getTextContent());
        }

1 Ответ

0 голосов
/ 11 августа 2011

Проверьте XPath 1.0 out:

 "/imagesXML/Images/Image/*[self::ImageUID or self::URRL128]/@Value"

Как показано в ваших входных данных, я думаю, вам не нужны пространства имен. В противном случае вы можете просто добавить их или выбрать local-name().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...