使用Xpath并从相同的属性名称读取值

时间:2019-04-04 11:25:55

标签: c# xml parsing

我正在使用Xpath解析XML文档。步骤节点具有步骤形式的属性。我正在尝试获取每个步骤的价值。例如0.03,0.025,0.05 ....但是使用我的代码,我只得到第一个值,即字符串列表中的0.03。这是我尝试过的代码:

XML file

private void btn_steps_Click(object sender, EventArgs e)
{
    List<string> step = new List<string>();

    XmlDocument doctst = new XmlDocument();

    doctst.Load(@"C:\ehData\workData\mywork.xml");

    XmlNodeList nodelistst = doctst.Selectnodes("//steps");

    foreach (XmlNode node in nodelistst)
    {
        step.Add(node["step"].InnerText);
    }

    listBox2.DataSource = step;
}

此外,我正在附加要解析的XML文件图像。我在此守则中做错了什么?

以下是XML文件的几行

<devices orderNo="67354698">
    <device serno="P1002001190">
      <steps>
        <step descriptor="160000556" element="1" usage="B">0.03</step>
        <step descriptor="160000556" element="2" usage="B">0.025</step>
        <step descriptor="160000556" element="3" usage="B">0.05</step>

2 个答案:

答案 0 :(得分:1)

我不确定是要属性值还是要内部文本。 因此,我把所有东西都放在这里。

检索属性:

要从第一个descriptor元素获取step属性-您可以在XPath下面使用:

/devices/device/steps/step[1]/@descriptor

此XPath将返回-descriptor="160000556"

如果只需要值,则可以使用:

string(/devices/device/steps/step[1]/@descriptor)

这将仅返回值,即160000556

您可以申请元素或用法属性的相同策略。

检索内部文本:

要获取第二个step元素的内部文本,可以在XPath下面使用:

/devices/device/steps/step[2]/text()

现在这些XPath可以循环运行并更改方括号内的索引以获取所有属性和元素。

希望这会有所帮助。

答案 1 :(得分:1)

1)通过将 XmlDocument.GetElementsByTagName() 与xml标签名配合使用

...

XmlNodeList nodelistst1 = doctst.GetElementsByTagName("step");

foreach (XmlNode node in nodelistst1)
{
    step.Add(node.InnerText);
}

2)通过在XPath中使用 XmlDocument.SelectNodes()

...

XmlNodeList nodelistst = doctst.SelectNodes(".//devices/device/steps/step/text()");

foreach (XmlNode node in nodelistst)
{
    step.Add(node.Value);
}

所以最后您从上述两个选项得到的结果都是

foreach (var item in step)
{
    Console.WriteLine(item);
}

输出:(用于从OP提供的文本XML)

enter image description here