我很肯定这是一个简单的问题,但我无法弄明白。
我正在将一个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做这件事,但感觉非常非常脏。
答案 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);