具有值的节点列表和父属性作为名称

时间:2015-12-03 16:07:40

标签: xml xpath jenkins

我是XML文件的新手,我正在尝试使用XPath获取一些值。我将使用Plot plugin在Jenkins中绘制这些值。这将获取x轴上的元素名称和y轴上的元素值。

我的xml文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<foo>
    <file file_name="file1.c">
        <metrics>
            <metric id="M1">15</metric>
            <metric id="M2">7</metric>
            <metric id="M3">9</metric>
        </metrics>
    </file>
    <file file_name="file2.c">
        <metrics>
            <metric id="M1">1110</metric>
            <metric id="M2">56</metric>
            <metric id="M3">1</metric>
        </metrics>
    </file>
</foo>

我想为所有M1绘制file_name,因此我需要使用XPath返回nodelist喜欢

<file1.c>15</file1.c>
<file2.c>1110</file1.c>

我试过

//file/metrics/*[@id='M1']

但我得到了

<metric id="M1">15</metric>
<metric id="M1">15</metric>

我发现了一些类似的问题,但无法适应我的情况: 例如,This会返回包含所有子项的父元素。

我如何实现我的需要?

1 个答案:

答案 0 :(得分:0)

XPath无法自行创建新元素。您必须使用XQuery或XSLT转换或使用您选择的语言中的DOM和XPath的组合进行自制解析。 XPath 2.0可能有所帮助,但我猜你只限于XPath 1.0。

BTW我会在你的XPath表达式中添加一些上下文,而不是使用*

//file/metrics/metric[@id='M1']

单独使用XPath 2.0,您可以这样做:

string-join(//file/(@file_name,metrics/metric[@id='M1']/text()),',')

获取包含所需数据的字符串:

file1.c,15,file2.c,1110

它比XPath 1更强大。

使用XQuery 1.0,你可以写:

<document_element>
{
  for $f in //file
  return element { $f/@file_name } { $f/metrics/metric[@id='M1']/text() }
}
</document_element>

得到你想要的答案:

<?xml version="1.0" encoding="UTF-8"?>
<document_element>
   <file1.c>15</file1.c>
   <file2.c>1110</file2.c>
</document_element>

我们使用计算元素构造函数element { ... } { ... }来动态创建一个新元素,其名称基于文件中的某个值。 XQuery功能强大且使用方便。