我需要使用C#
解析一个简单的XML字符串<items>
<item1 value="value1" />
<item2 value="value2" />
<item3 value="value3" />
<itme4 value="value4" />
<item5 value="value5" />
<itme6 value="value6" />
</items>
我正在努力做到如下:
XMLParser XMLParserObj = new XMLParser();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
string item1 = xmlDoc.Attributes.GetNamedItem("item1").Value;
string item2 = xmlDoc.Attributes.GetNamedItem("item2").Value;
string item3 = xmlDoc.Attributes.GetNamedItem("item3").Value;
string item4 = xmlDoc.Attributes.GetNamedItem("item4").Value;
string item5 = xmlDoc.Attributes.GetNamedItem("item5").Value;
string item6 = xmlDoc.Attributes.GetNamedItem("item6").Value;
没有运气
请告知..
答案 0 :(得分:5)
可能的解决方案是使用LINQ2XML:
// retrieve a single element by tag name
private XElement getElement(XDocument xmlDocument, string elementName)
{
var element = xmlDocument.Descendants("items").Elements().Where (x => x.Name == elementName).FirstOrDefault();
return element != null ? element : null;
}
// retrieve attribute by name
private string attributeValue(XElement item, string attributeName)
{
var attribute = item.Attribute(attributeName);
return attribute != null ? attribute.Value : string.Empty;
}
这两个功能可以这样使用:
// input for the example
var input = @"<items>
<item1 value=""value1"" />
<item2 value=""value2"" />
<item3 value=""value3"" />
<itme4 value=""value4"" />
<item5 value=""value5"" />
<item6 value=""value6"" />
</items>";
var xml = XDocument.Parse(input);
var element = getElement(xml, "item2");
if (element != null)
{
Console.WriteLine(attributeValue(element, "value"));
}
输出结果为:
value2
对于像这样的重复性任务,将方法实现为扩展通常是有利的:
public static class ProjectExtensions
{
// retrieve a single element by tag name
public static XElement GetElementByName(this XDocument xmlDocument, string parentElementName, string elementName)
{
var element = xmlDocument.Descendants(parentElementName).Elements().Where (x => x.Name == elementName).FirstOrDefault();
return element != null ? element : null;
}
// retrieve attribute by name
public static string GetAttributeValueByName(this XElement item, string attributeName)
{
var attribute = item.Attribute(attributeName);
return attribute != null ? attribute.Value : string.Empty;
}
}
IMO的使用更加简单和清洁:
var xml = XDocument.Parse(input);
var element = xml.GetElementByName("items", "item2");
if (element != null)
{
Console.WriteLine(element.GetAttributeValueByName("value"));
}
您当然可以(如已经建议的那样)直接使用XPath。
答案 1 :(得分:3)
保留所有代码相同但更改此内容:
string item1 = xmlDoc.GetElementsByTagName("item1")[0].Attributes[0].Value;
对其他项目执行相同操作,您将获得该值。
答案 2 :(得分:2)
假设您想要每个item元素的value属性,可以使用Xpath:
string xmlString = "<items><item1 value=\"value1\" /><item2 value=\"value2\" /><item3 value=\"value3\" /><item4 value=\"value4\" /><item5 value=\"value5\" /><item6 value=\"value6\" /></items>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
string item1 = xmlDoc.SelectSingleNode("items/item1/@value").InnerText;
string item2 = xmlDoc.SelectSingleNode("items/item2/@value").InnerText;
string item3 = xmlDoc.SelectSingleNode("items/item3/@value").InnerText;
string item4 = xmlDoc.SelectSingleNode("items/item4/@value").InnerText;
string item5 = xmlDoc.SelectSingleNode("items/item5/@value").InnerText;
string item6 = xmlDoc.SelectSingleNode("items/item6/@value").InnerText;
答案 3 :(得分:0)
你错过了“属性”一词,你试图捕捉“item1”,它实际上是一个节点。
使用此:
string item1 = xmlDoc.SelectSingleNode("//items/item1").Attributes["value"].value;
还有其他选项,但这会为您提供所需的值。
干杯...
答案 4 :(得分:0)
这将为您提供所有这些属性值:
1)如果来自字符串XDocument.Parse(),请使用XDocument.Load()加载xml,然后执行以下操作:
IEnumerable<string> result = from node in xmlDoc.Root.Descendants()
select node.Attribute("value").Value;