我有一个库存记录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文件的结构以使其更易于访问,但我想不到一个。
答案 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