在xml文件中查询以从节点中选择值

时间:2016-02-29 17:47:24

标签: java xml xpath

例如,这是我有的那种xml文件:

<Node>
    <Sample A>
        ...
    </Sample A>
    <Sample B>
        <myType>importantValue</myType>
    </Sample B>
    ...
    <Sample Z>
        <myValue>16</myValue>
    </Sample Z>
<Node>
    <Sample A>
        ...
    </Sample A>
    <Sample B>
        <myType>importantValue</myType>
    </Sample B>
    ...
    <Sample Z>
        <myValue>16</myValue>
    </Sample Z>

如何进行类似于“在myValue&gt; x中选择myType和myValue”的查询?

我正在尝试使用xPath来找到正确的元素,我确信有一种简单的方法可以做到这一点,但由于我是XML新手,我找不到简单的方法..提前感谢!< / p>

2 个答案:

答案 0 :(得分:0)

以下是步骤。希望你没有错过它们。

从文件或流中创建文档

StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version="1.0"?> <class> </class>");
ByteArrayInputStream input =  new ByteArrayInputStream(
   xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);

构建XPath

XPath xPath =  XPathFactory.newInstance().newXPath();

准备路径表达并对其进行评估

String expression = "/Node/SampleB";            
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);

迭代NodeList

for (int i = 0; i < nodeList.getLength(); i++) {
   Node nNode = nodeList.item(i);
   ...
}

检查属性

//returns specific attribute
getAttribute("attributeName"); 
//returns a Map (table) of names/values
getAttributes(); 

检查子元素

//returns a list of subelements of specified name
getElementsByTagName("subelementName"); 
//returns a list of all child nodes
getChildNodes(); 

在你的情况下,

String expression = "/Node/SampleB";
for (int i = 0; i < nodeList.getLength(); i++) {
            Node nNode = nodeList.item(i);
            System.out.println("\nCurrent Element :" + nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               System.out.println(eElement.getElementsByTagName("myType")
                     .item(0).getTextContent());}}

答案 1 :(得分:0)

假设您的XML结构如下:

<Node>
  <Sample>
    <someValue>sharks</someValue>
  </Sample>
  <Sample>
    <myValue>16</myValue>
  </Sample>
  <Sample>
    <myType>importantValue</myType>
  </Sample>
</Node>
<Node>
  ...
</Node>
...

SamplesNode元素分组,然后你想要的是找到具有你想要的属性的特定Node,然后找到同一个{{1}的值你想要的。

这是一个XPath表达式,Node获得Node

Sample/myValue

这标记为“让所有//Node[Sample/myValue = '16'] 孩子Nodes的孩子Sample的值为myValue”。

您可以添加它以获得不同的值:

'16'

这会更改XPath表达式的返回值,其内容为“从//Node[Sample/myValue = '16']/Sample/myType 获取值,其父级为myType,其父级为Sample Node }的值是Sample/myValue“。

要从XPath表达式中获取多个值,可以使用'16'运算符将多个表达式组合在一起:

|

这读作“获取//Node[Sample/myValue = '16'] | //Node[Sample/myValue = '15'] 值为NodesSample/myValue”的所有'16'