2014-09-16 3 views
-1

Есть ли способ, которым я могу извлечь данные, чтобы он выводился следующим образом?Использование xpath для извлечения списка значений

Color, Cognac, Shoe Size, 12, 10994 
Color, Cognac, Shoe Size, 13, 10995 

Значения внутри любых тегов могут быть динамическими, поэтому селекторы должны использовать имена тегов.
Будет динамическое число SKU s.

Я способен извлекать отдельные значения например

//SKUs/Attributes/name/text() .. Color 
//SKUs/Attributes/Values/values/text() .. Cognac 

Но динамическая природа числа SKUs+Attributes является сложной задачей.

XML ..

<?xml version="1.0" encoding="UTF-8"?> 

<root> 
    <SKUs> 
    <Attributes> 
     <Values> 
     <values>Cognac</values> 
     </Values> 
     <name>Color</name> 
    </Attributes> 
    <Attributes> 
     <Values> 
     <values>12</values> 
     </Values> 
     <name>Shoe Size</name> 
    </Attributes> 
    <SKUUniqueID>10994</SKUUniqueID> 
    </SKUs> 
    <SKUs> 
    <Attributes> 
     <Values> 
     <values>Cognac</values> 
     </Values> 
     <name>Color</name> 
    </Attributes> 
    <Attributes> 
     <Values> 
     <values>13</values> 
     </Values> 
     <name>Shoe Size</name> 
    </Attributes> 
    <SKUUniqueID>10995</SKUUniqueID> 
    </SKUs> 
</root> 
+0

Вы даже не указали, на каком языке вы работаете. – taco

+0

Было бы легко предоставить автономный ответ на этот вопрос с помощью XQuery. XPath, однако, недостаточно силен, чтобы сделать это за один шаг - это значит, что нам нужно иметь возможность запускать несколько запросов XPath, то есть нам нужно знать ваш язык реализации. –

+0

Спасибо @CharlesDuffy, не понимал, что 'XPath' не мог сделать это сам без вмешательства языка реализации. Я работаю в 'Java' – bobbyrne01

ответ

0

Это, как вы могли бы сделать с помощью Java.

вам нужно подсчитать SKU первым и перебирать на них

import java.io.FileInputStream; 

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

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 

public class XPathExample { 

    public static void main(String[] args) throws Exception { 
     /* 
     * disclaimer - code from http://viralpatel.net/blogs/java-xml-xpath-tutorial-parse-xml/ 
     */ 
     DocumentBuilderFactory builderFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
     Document xmlDocument = builder.parse(new FileInputStream(
       "//path//to//sample.xml")); 
     XPath xPath = XPathFactory.newInstance().newXPath(); 

     NodeList skus = (NodeList) xPath.compile("//SKUs").evaluate(xmlDocument, XPathConstants.NODESET); 
     for(int i=1;i<skus.getLength()+1;i++) { 
      String t1 = xPath.compile("//SKUs["+i+"]/Attributes[1]/name[1]").evaluate(xmlDocument); 
      String t2 = xPath.compile("//SKUs["+i+"]/Attributes[1]/Values/identifier[1]").evaluate(xmlDocument); 
      String t3 = xPath.compile("//SKUs["+i+"]/Attributes[2]/name[1]").evaluate(xmlDocument); 
      String t4 = xPath.compile("//SKUs["+i+"]/Attributes[2]/Values/identifier[1]").evaluate(xmlDocument); 
      String id = xPath.compile("//SKUs["+i+"]/SKUUniqueID").evaluate(xmlDocument); 
      System.out.println(t1+","+t2+","+t3+","+t4+","+id); 
     } 
    } 
} 

также заметить, что это не ясно, в вашем XML, где значения приходят от потому, что они могут поступать из разных мест.

+0

Это позволило бы мне более эффективно работать с большими необработанными документами, если бы вы сначала нашли элемент «SKUs» и выполнили остальные ваши запросы относительно этого элемента, не относящиеся к корню. Хуже того, использование конкатенации строк для построения запроса, а не связывания переменных, открывает вам эквивалент SQL-инъекции XPath. –

+0

... то есть - если вы делаете это правильно, вы можете искать 'SKUs [$ i]' и переходить в 'i' вне диапазона. –

+0

Кроме того, это означает, что вам ** не нужно сначала подсчитывать SKU, но может потребовать, чтобы ваш первый запрос возвращал набор элементов SKU, а ваши другие запросы выполнялись непосредственно из этого возвращенного элемента, а не из корня документа. –

Смежные вопросы