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

C# 使用Xpath并从相同的属性名读取值,c#,xml,parsing,C#,Xml,Parsing,我正在使用Xpath解析XML文档。步骤节点具有步骤形式的属性。我试图得到每一步的价值。例如0.03、0.025、0.05。。。。但我的代码只得到字符串列表中的第一个值,即0.03。以下是我尝试的代码: private void btn\u步骤\u单击(对象发送方,事件参数e) { 列表步骤=新建列表(); XmlDocument doctst=新的XmlDocument(); doctst.Load(@“C:\ehData\workData\mywork.xml”); XmlNodeList

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

private void btn\u步骤\u单击(对象发送方,事件参数e)
{
列表步骤=新建列表();
XmlDocument doctst=新的XmlDocument();
doctst.Load(@“C:\ehData\workData\mywork.xml”);
XmlNodeList nodelist=doctst.Selectnodes(//步骤);
foreach(nodelist中的XmlNode节点)
{
添加(节点[“步骤”].InnerText);
}
listBox2.DataSource=步骤;
}
此外,我还附加了试图解析的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>

0.03
0.025
0.05

我不确定您想要的是属性值还是内部文本。 因此,我把一切都放在这里

检索属性:

要从第一个
步骤
元素获取
描述符
属性,可以使用以下XPath:

/devices/device/steps/step[1]/@descriptor
/devices/device/steps/step[2]/text()
此XPath将返回-
descriptor=“160000556”

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

string(/devices/device/steps/step[1]/@descriptor)
这将只返回值,即
160000556

您可以对元素或使用属性应用相同的策略

检索内部文本:

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

/devices/device/steps/step[1]/@descriptor
/devices/device/steps/step[2]/text()
现在,您可以通过这些XPath运行循环并更改方括号内的索引,以获得所有属性和元素


希望这有帮助。

我不确定您是想要属性值还是想要内部文本。 因此,我把一切都放在这里

检索属性:

要从第一个
步骤
元素获取
描述符
属性,可以使用以下XPath:

/devices/device/steps/step[1]/@descriptor
/devices/device/steps/step[2]/text()
此XPath将返回-
descriptor=“160000556”

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

string(/devices/device/steps/step[1]/@descriptor)
这将只返回值,即
160000556

您可以对元素或使用属性应用相同的策略

检索内部文本:

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

/devices/device/steps/step[1]/@descriptor
/devices/device/steps/step[2]/text()
现在,您可以通过这些XPath运行循环并更改方括号内的索引,以获得所有属性和元素

希望这有帮助。

1)使用带有xml标记名的
XmlDocument.GetElementsByTagName()

...

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

foreach (XmlNode node in nodelistst1)
{
    step.Add(node.InnerText);
}
2)通过将
XmlDocument.SelectNodes()与XPath一起使用

...

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)

1)使用带有xml标记名的
XmlDocument.GetElementsByTagName()

...

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

foreach (XmlNode node in nodelistst1)
{
    step.Add(node.InnerText);
}
2)通过将
XmlDocument.SelectNodes()与XPath一起使用

...

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)


请将Xml数据以文本形式发布在此处-不要指望这里的人只是为了重现您的问题并帮助您而重新键入您的数据。使用Xml Linq这一新的网络库方法比标准Xml库容易得多。我已将Xml文件添加为图像。请看。我不能发布文本,因为它很长。@Sohaib,我用下面的输出添加了我的答案,请尝试并让我知道:)请将Xml数据作为文本发布在此处-不要期望这里的人重新键入您的数据只是为了重现您的问题并帮助您。使用Xml Linq这是一种新的Net a库方法,比标准Xml库容易得多。我已将Xml文件作为图像添加。请看。我无法发布文本B,因为它太长了。@Sohaib,我在下面添加了我的答案并输出了结果。请尝试并让我知道:)嗨。谢谢你发布代码。实际上,我想要字符串列表中的内部文本,即0.03,0.025,0.5。谢谢你发布代码。实际上,我想要字符串列表中的内部文本,即0.03,0.025,0.5。