Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取多个XML属性_C#_Xml - Fatal编程技术网

C# 读取多个XML属性

C# 读取多个XML属性,c#,xml,C#,Xml,我试图在VisualStudio中使用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"/> &l

我试图在VisualStudio中使用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>
我知道这段代码只会在控制台中显示一些q属性。我从来没有去弗德,因为它不工作(控制台窗口中没有显示任何内容)。我不知道为什么。我只是不明白这个文件。我在这里学习表格:。我在跟踪每一个细节和例子。我只想给我点东西。但它只读取所有内容,而不读取特定区域


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

考虑使用
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);
}

然后您将返回64项。

假设xml格式正确,并且根节点正确关闭, 字符串
度量值
中有一个输入错误,这是正确地选择了所有
q
标记

XmlNodeList titleNodes = xmlDoc.SelectNodes("//buttons/measurement/scan/q");
如果你只想要一个id下的

XmlNodeList titleNodes = xmlDoc.SelectNodes("//buttons/measurement/scan[@id=2]/q") ;
如果没有这样的id,您将得到一个空集合,但不会出现异常错误:因此,该案例得到了管理

最后,不要忘记
字段

Console.WriteLine(titleNode.Attributes["address"].Value);

我没有对此进行太多研究,但是您的
SelectNodes
的大小写错误-尝试更改大写字母“Q”-
“//按钮/measurement/scan/Q”
您输入了扫描id,并获得了所有的Q状态吗?这就是你们问我的错误,在从特定扫描区域开出所有q状态的处方时。例如,标记扫描有一个atribute id=“0”,我想从这个标记区域获得所有的q状态。你要做的是这样的:选择节点(//scan[contains(id),“'YOURSELECTEDID'”)”))”),如果扫描为空(当找不到id时),你会在foreach中得到一个
NullReferenceException
。。。所以
?。
只会推迟到下一条指令。我建议使用
var states=scan?.subjects(“q”)。选择(q=>q.Attribute(“state”).Value)??Empty():-)但当然有上千种方法…此解决方案看起来不错,但VisualStudio不记录XDocument。是的,我添加了System.Linq库。@MrJW is和minimum.Net Framework的名称空间是3.5(Visual Studio 2008),我键入了文件路径,例如“XDocument.Parse(/data/test.xml)”文件test.xml包含我的主要帖子中描述的数据。我还添加了library System.Xml.Linq,但在运行应用程序时,出现了“unhandle apperars”例外:“System.Xml.xmleexception”类型的未处理异常出现在System.Xml.dll中。其他信息:根级别的数据无效。第1行,位置1。“您的解决方案看起来最好,但(我不知道为什么)属性无法识别。我只是在这个词下面划了一条红线。对不起,我打错了。我不是以英语为母语的人,我翻译了我的代码,所以这里更容易编辑。经过一些调整后,一切正常(我的代码部分,你的代码很完美:)。谢谢,你帮了我很多:)
XmlNodeList titleNodes = xmlDoc.SelectNodes("//buttons/measurement/scan[@id=2]/q") ;
Console.WriteLine(titleNode.Attributes["address"].Value);