【问题标题】:Using Xpath and reading values from same attribute name使用 Xpath 并从相同的属性名称读取值
【发布时间】:2019-04-04 11:25:55
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 请在此处以文本形式发布 Xml 数据 - 不要指望这里的人们重新键入您的数据只是为了重现您的问题并帮助您。
  • 使用 Xml Linq 比标准 xml 库更容易使用,这是一种新的 Net a Library 方法。
  • 我已将 XML 文件添加为图像。请看一下。我无法发布文本,因为它很长。
  • @Sohaib,我在下面的输出中添加了我的答案,试试吧,让我知道 :)

标签: c# xml parsing


【解决方案1】:

1) 通过使用 XmlDocument.GetElementsByTagName() 和 xml 标记名称

...

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)

【讨论】:

    【解决方案2】:

    我不确定您是想要属性值还是想要内部文本。 因此,我将所有内容都放在这里。

    检索属性:

    为了从第一个 step 元素获取 descriptor 属性 - 您可以在 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 并更改方括号内的索引以获取所有属性和元素。

    希望这会有所帮助。

    【讨论】:

    • 嗨。感谢您发布代码。实际上我想要字符串列表中的内部文本,即 0.03,0.025,0.5。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多