2012-02-07 8 views
0

У меня есть файл записи инвентаря XML для хранения количества каждого элемента.Доступ к параметрам из файла XML в java

<Inventory> 
<Item> 
    <ManufacturerName>Brand1</ManufacturerName> 
    <ProductType>TV</ProductType> 
    <Quantity>146</Quantity> 
</Item> 
<Item> 
    <ManufacturerName>Brand2</ManufacturerName> 
    <ProductType>TV</ProductType> 
    <Quantity>221</Quantity> 
</Item> 
<Item> 
    <ManufacturerName>Brand3</ManufacturerName> 
    <ProductType>TV</ProductType> 
    <Quantity>36</Quantity> 
</Item> 
</Inventory> 

В моей Java программы, если я получаю запрос на определенный пункт, я проверить количество элементов этого типа оставшихся (параметр количества) и, если есть достаточно вычесть эту сумму из файла XML , Я могу сделать это, перейдя через каждый узел XML и проверив тот, который я хочу, но я надеялся, что есть быстрый способ получить доступ к одному конкретному узлу сразу. Возможно, структура XML-файла может быть изменена, чтобы сделать его более доступным, но я не могу думать об этом.

+0

Это может быть дубликат, возможно, с ним можно было бы многое сделать, используя это, например. http://stackoverflow.com/questions/8578455/java-all-child-element-reading-in-xml –

ответ

3

Что вы ищете XPath, вот небольшой пример:

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

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

public class GetAllTheChildren { 
public static void main(String[] args) { 

try{ 
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
    documentBuilderFactory.setNamespaceAware(true); 
    DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); 
    Document doc = builder.parse("/home/eugen/Desktop/input.txt"); 

    XPathFactory xPathFactory = XPathFactory.newInstance(); 
    XPath xpath = xPathFactory.newXPath(); 

    XPathExpression expression = xpath.compile("/Inventory/Item[Quantity>200]/*"); 

    NodeList nodes = (NodeList) expression.evaluate(doc, XPathConstants.NODESET); 

    for(int i = 0;i<nodes.getLength();i++){ 
     System.out.println(nodes.item(i).getNodeName()); 
     System.out.println(nodes.item(i).getTextContent()); 
    } 
} catch(Exception exception){ 
    exception.printStackTrace(); 
} 

} 

}

Вы, вероятно, нужно играть немного больше с ним

Приветствия, Юджин.

+0

Спасибо, я искал что-то похожее на шаблоны, чтобы вытащить именно то, что мне нужно. XPathExpression делает это. –

+0

@SotiriosDelimanolis рад, что я мог бы помочь;) – Eugene

1

Есть много способов, чтобы иметь дело с XML в Java. Например, вы можете посмотреть на Castor. С Castor вы «загрузите» XML в класс Java, внесите свои изменения в Java, а затем преобразуете его обратно в XML.

0

DOM4J (анализатор с открытым исходным кодом xml http://dom4j.sourceforge.net/) является хорошей подгонкой.

Вы можете вызвать метод Element.elements(), чтобы получить общее количество его дочерних узлов. Используйте Element.element (String name), чтобы получить определенный узел с именем. Обратитесь к этому API-документу: http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/Element.html#element%28java.lang.String%29

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