2

我很肯定这是一个简单的问题,但我无法弄清楚。

我正在将 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

4 回答 4

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了整个文档中的所有节点。

于 2012-04-13T15:18:36.283 回答
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; 
   }
} 

应该管用?

于 2012-04-13T15:19:41.923 回答
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);
于 2012-04-13T15:27:35.690 回答
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);
于 2012-04-13T15:31:24.097 回答