C# 通过搜索“名称”检索元素“值”

C# 通过搜索“名称”检索元素“值”,c#,xml,C#,Xml,我肯定这是个简单的问题,但我搞不懂 我正在将一个XML文件下载到C中的字符串中,它包含以下格式的项: <attribute name="Make" value="Volvo" /> <attribute name="Color" value="Blue" /> <attribute name="Damage" value="Rear scratched" /> <attribute name="Damage" value="Left hand side

我肯定这是个简单的问题,但我搞不懂

我正在将一个XML文件下载到C中的字符串中,它包含以下格式的项:

<attribute name="Make" value="Volvo" />
<attribute name="Color" value="Blue" />
<attribute name="Damage" value="Rear scratched" />
<attribute name="Damage" value="Left hand side dented" />
我要做的就是获取整个文档中的所有损坏值,不管它们在数组中的哪个位置。我一直在玩XmlDocument/XmlNodeList,但我就是不知道如何让它工作

我有点想用正则表达式来做这件事,但感觉非常脏。

使用XDocument:

请注意: 这段代码相对简单,因为它考虑了整个文档中的所有属性节点

string val = "";
XmlDocument doc = new XmlDocument();  

doc.Load("file.xml");

XmlNodeList nodes = doc.SelectNodes("/attribute[@name='Damage']");

foreach (XmlNode node in nodes)
{
   {
      val = node.Attributes["value"].Value; 
   }
} 

应该可以吗?

您可以利用LINQ-TO-XML,但您必须为其提供一个严格的XML,所以只需手动创建根节点,否则您将得到System.XML.XmlException:有多个根元素


这不是一个XML文档,而是一个片段。您需要使用根元素来包装它。这将起作用:

string fragment = File.ReadAllText("file.xml");
var doc = XDocument.Parse("<root>" + fragment  + "</root>");

var values = from element in doc.XPathSelectElements(@"//attribute[@name='Damage']")
             select element.Attribute("value").Value;

values.ToList().ForEach(Console.WriteLine);

警告:问题中的属性列表不能按原样使用此代码。没有根元素。如果attribute元素有一个parent attributes元素,那么这个代码示例工作得很好。@GlennFerrieLive:这不是代码的问题,而是提供的示例数据的问题,因为这根本不是有效的XML,我假设OP只显示了相关的部分。很有趣,为什么你用了两个呢expressions@sll当前位置我发现这样读起来稍微容易一些。第一个Where子句过滤掉所有没有必需属性的属性。这是避免NullReferenceException所必需的,可以看作是一个纯粹的技术过滤器。第二个Where子句是业务筛选器。这非常有效,谢谢@DanielHilgarth——正如前面所说,完整文档是有效的XML。使用Linq to XML=快速且易于阅读的代码。请不要在标题前加上XML/C之类的前缀。这就是标记的用途。@DanielHilgarth代码是在我的原始注释之后编辑的,我现在将删除它以响应编辑修复。
// raw - your XML
string raw = File.ReadAllText("c:\\test1.xml");

// create root node manually
string xml = "<root>" + raw + "</root>";
var xdoc = XDocument.Parse(xml);       

// contains IEnumerable<string>
// TODO: add null-checks
var damagedValues = xdoc.Descendants("attribute")
                        .Where(e => e.Attribute("name").Value == "Damage")
                        .Select(e => e.Attribute("value").Value);
string fragment = File.ReadAllText("file.xml");
var doc = XDocument.Parse("<root>" + fragment  + "</root>");

var values = from element in doc.XPathSelectElements(@"//attribute[@name='Damage']")
             select element.Attribute("value").Value;

values.ToList().ForEach(Console.WriteLine);