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

时间:2012-04-13 15:14:11

标签: 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 dented" />

我想要做的就是将整个文档中的“损坏”的值所有(无论它们落在哪里)到数组中。我一直在玩XmlDocument / XmlNodeList,但我无法弄清楚如何让它工作。

我很想用RegEx做这件事,但感觉非常非常脏。

4 个答案:

答案 0 :(得分:7)

使用XDocument

var doc = XDocument.Parse(xml);
var result = doc.Descendants("attribute")
                .Where(x => x.Attribute("name") != null &&
                            x.Attribute("value") != null)
                .Where(x => x.Attribute("name").Value == "Damage")
                .Select(x => x.Attribute("value").Value)
                .ToArray();

请注意:
此代码相对简单,因为它考虑了整个文档中的所有attribute个节点。

答案 1 :(得分:1)

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; 
   }
} 

应该有用吗?

答案 2 :(得分:1)

您可以利用LINQ-TO-XML,但是您必须为其提供正确的XML,因此只需手动创建根节点,否则最终会得到System.Xml.XmlException : There are multiple root elements.

// 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);

答案 3 :(得分:1)

嗯,那不是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);