从java中的XML文件访问参数

时间:2012-02-07 18:49:32

标签: java xml

我有一个库存记录XML文件来存储每个项目的数量。

<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程序中,如果我收到某个项目的请求,我会检查该类型的项目数量(Quantity参数),如果有足够的,则从XML文件中减去该数量。我可以通过遍历XML的每个节点并检查我想要的那个来做到这一点,但我希望有一种更快的方式来立即访问一个特定节点。也许可以更改XML文件的结构以使其更易于访问,但我想不到一个。

4 个答案:

答案 0 :(得分: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();
}

}

}

你可能需要多玩一点

干杯,尤金。

答案 1 :(得分:2)

答案 2 :(得分:1)

在Java中处理XML的方法有很多种。例如,您可能需要查看Castor。使用Castor,您可以将XML“加载”到Java类中,使用Java进行更改,然后将其转换回XML。

答案 3 :(得分: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