c# - 读取多个 XML 属性

标签 c# xml

我正在尝试在 Visual Studio 中使用 C# 从 XML 库(下面的文件)获取信息。

<buttons>
<measurement>
    <scan id="0" time="20 53 06">
        <q address="40" state="0"/>
        <q address="41" state="0"/>
        <q address="42" state="1"/>
        <q address="43" state="0"/>
        <q address="44" state="1"/>
        <q address="45" state="1"/>
        <q address="46" state="1"/>
        <q address="47" state="1"/>
    </scan>
</measurement>
<measurement>
    <scan id="1" time="20 53 07">
        <q address="40" state="0"/>
        <q address="41" state="0"/>
        <q address="42" state="0"/>
        <q address="43" state="0"/>
        <q address="44" state="1"/>
        <q address="45" state="0"/>
        <q address="46" state="0"/>
        <q address="47" state="0"/>
    </scan>
</measurement>
<measurement>
    <scan id="2" time="20 53 08">
        <q address="40" state="0"/>
        <q address="41" state="1"/>
        <q address="42" state="0"/>
        <q address="43" state="1"/>
        <q address="44" state="1"/>
        <q address="45" state="0"/>
        <q address="46" state="0"/>
        <q address="47" state="1"/>
    </scan>
</measurement>
<measurement>
    <scan id="3" time="20 53 09">
        <q address="40" state="1"/>
        <q address="41" state="0"/>
        <q address="42" state="0"/>
        <q address="43" state="1"/>
        <q address="44" state="1"/>
        <q address="45" state="0"/>
        <q address="46" state="1"/>
        <q address="47" state="0"/>
    </scan>
</measurement>
<measurement>
    <scan id="4" time="20 53 10">
        <q address="40" state="0"/>
        <q address="41" state="0"/>
        <q address="42" state="1"/>
        <q address="43" state="1"/>
        <q address="44" state="1"/>
        <q address="45" state="1"/>
        <q address="46" state="0"/>
        <q address="47" state="0"/>
    </scan>
</measurement>
<measurement>
    <scan id="5" time="20 53 11">
        <q address="40" state="1"/>
        <q address="41" state="1"/>
        <q address="42" state="1"/>
        <q address="43" state="0"/>
        <q address="44" state="0"/>
        <q address="45" state="0"/>
        <q address="46" state="1"/>
        <q address="47" state="0"/>
    </scan>
</measurement>
<measurement>
    <scan id="6" time="20 53 12">
        <q address="40" state="0"/>
        <q address="41" state="1"/>
        <q address="42" state="1"/>
        <q address="43" state="0"/>
        <q address="44" state="0"/>
        <q address="45" state="1"/>
        <q address="46" state="1"/>
        <q address="47" state="1"/>
    </scan>
</measurement>
<measurement>
    <scan id="7" time="20 53 13">
        <q address="40" state="1"/>
        <q address="41" state="1"/>
        <q address="42" state="1"/>
        <q address="43" state="1"/>
        <q address="44" state="1"/>
        <q address="45" state="0"/>
        <q address="46" state="1"/>
        <q address="47" state="1"/>
    </scan>
</measurement>

这是我第一次尝试读取 xml 文件。

这就是我想做的:
我想输入 ID,程序应该返回数组中的所有 q 状态。

这是我尝试过的:

using System.Xml;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("Path to my xml");
XmlNodeList titleNodes = xmlDoc.SelectNodes("//buttons/measurment/scan/q");
foreach(XmlNode titleNode in titleNodes)
    Console.WriteLine(titleNode.Attribute["address"]);
Console.ReadKey();

我知道这段代码只会在控制台中显示一些 q 属性。我从来没有走得更远,因为它不起作用(控制台窗口中没有出现任何内容)。我不知道为什么。我只是不明白这个XmlRead,XmlDeocument。我在这里学习:Tutorial 。我关注着每一个词干和例子。只有 XmlRead 给了我一些东西。但它只读取所有内容,而不读取特定区域。

您能给我一些示例或解决方案吗?

最佳答案

考虑使用 XDocument,它允许您使用 LINQ,使您的 xml 生活更轻松:

string myId = "2";

var doc = XDocument.Parse(xmlString); //or XDocument.Load(filePath)

//find the correct 'scan' node based on your id
var scan = doc.Descendants("scan")
              .FirstOrDefault(s => s.Attribute("id").Value == myId);

//grab all q's and get their 'state' for that 'scan' node
var states = scan?.Descendants("q")
                  .Select(q => q.Attribute("state").Value);

foreach (var state in states)
{
    Console.WriteLine(state);
}

关于c# - 读取多个 XML 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39101680/

相关文章:

xml - 避免使用“ancestor::” Xpath轴

xml - 一次返回两个 XML 节点

c# - 重构以将 NameValueCollection 和 KeyValueConfigurationCollection 作为参数?

c# - 使用空元素反序列化 Xml

c# - 如何从列表中查找倒数第二个元素?

c# - 高效检索和过滤文件

xml - 对源 XML 文档的多个小更改

c# - 如何从 C# 执行批处理文件?

xml - XSD 属性 NILLABLE 不起作用

javascript - 在 onload 中调用方法时重置值