C# 读取多个XML属性
我试图在VisualStudio中使用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
<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);