使用C#/.net 3.5从xml元素检索属性的最佳方法
如果我们有一个XML,比如:使用C#/.net 3.5从xml元素检索属性的最佳方法,c#,xml,.net-3.5,xpath,xelement,C#,Xml,.net 3.5,Xpath,Xelement,如果我们有一个XML,比如: <Data> <Cars> <Details> <Dataset se-datafilter="cars" dv-datamanipulationrequired="false" dv-filtercondition="" dv-sortcolumn="" dv-gettopNrows="" /> <XmlData></XmlData>
<Data>
<Cars>
<Details>
<Dataset se-datafilter="cars" dv-datamanipulationrequired="false" dv-filtercondition="" dv-sortcolumn="" dv-gettopNrows="" />
<XmlData></XmlData>
</Details>
</Cars>
<Jeeps>
<Details>
<Dataset se-datafilter="jeeps" dv-datamanipulationrequired="false" dv-filtercondition="" dv-sortcolumn="" dv-gettopNrows="" />
<XmlData></XmlData>
</Details>
</Jeeps>
</Data>
使用以下XPath:
//Dataset/@*
,例如:
var doc = XDocument.Load("a.txt");
var sMainTagName = "Cars";
string xPath = "Data/" + sMainTagName + "/Details/Dataset/@*";
var attr = (doc.Document.XPathEvaluate(xPath) as IEnumerable).Cast<XAttribute>();
foreach (var item in attr)
{
Console.WriteLine("{0}: {1}", item.Name, item.Value);
}
var doc=XDocument.Load(“a.txt”);
var sMainTagName=“汽车”;
字符串xPath=“Data/”+sMainTagName+”/Details/Dataset/@*”;
var attr=(doc.Document.xpatheevaluate(xPath)为IEnumerable.Cast();
foreach(属性中的变量项)
{
WriteLine(“{0}:{1}”,item.Name,item.Value);
}
我是Linq to Xml的粉丝。下面是一个例子:
static void Main(string[] args)
{
var rawXml =
@"<Data>
<Cars>
<Details>
<Dataset se-datafilter=""cars"" dv-datamanipulationrequired=""false"" dv-filtercondition="""" dv-sortcolumn="""" dv-gettopNrows="""" />
<XmlData></XmlData>
</Details>
</Cars>
<Jeeps>
<Details>
<Dataset se-datafilter=""jeeps"" dv-datamanipulationrequired=""false"" dv-filtercondition="""" dv-sortcolumn="""" dv-gettopNrows="""" />
<XmlData></XmlData>
</Details>
</Jeeps>
</Data>
";
var xDoc = XDocument.Parse(rawXml);
var filterName = "jeeps";
var attrs = xDoc.Descendants("Dataset").Where(
x => string.Equals(x.Attribute("se-datafilter").Value,
filterName,
StringComparison.CurrentCultureIgnoreCase
))
.Attributes();
foreach (var attr in attrs)
{
Console.WriteLine(attr.Value);
}
}
}
static void Main(字符串[]args)
{
var-rawXml=
@"
";
var xDoc=XDocument.Parse(rawXml);
var filterName=“吉普车”;
var attrs=xDoc.substands(“数据集”)。其中(
x=>string.Equals(x.Attribute(“se数据过滤器”).Value,
过滤名称,
StringComparison.CurrentCultureInoRecase
))
.Attributes();
foreach(属性中的var attr)
{
控制台写入线(属性值);
}
}
}
如何返回一个字典,从属性开始构建
return xdoc.XPathSelectElements("/Data/" + sMainTagName + "/Details/Dataset")
.Attributes()
.ToDictionary(attr => attr.Name, attr => attr.Value);
就我个人而言,我不会首先使用XPath。我会这样做:
// Note - if an element in this chain doesn't exist, you'll get a
// NullReferenceException
var details = doc.Element("Data")
.Element(mainTagName)
.Element("Details")
.Element("Dataset");
string dataFilter = ((string) details.Attribute("se-datafilter")) ?? "";
string filterCondition= ((string) details.Attribute("dv-filtercondition")) ?? "";
string sortCol = ((string) details.Attribute("dv-sortcolumn")) ?? "";
(顺便说一句,我假设只有一个数据集元素。)
这使用了这样一个事实:如果属性不存在(即,您在null引用上调用它),则来自
XAttribute
的显式字符串转换将返回null。有两个数据集元素。您还没有明确说明要检索哪一个。@Jon,sMainTagName将决定选择哪一个。它不是汽车就是吉普车。另外,更新了原来的帖子。谢谢你的解决方案,这很简单,很适合我的情况。不过,其他解决方案也很好。
// Note - if an element in this chain doesn't exist, you'll get a
// NullReferenceException
var details = doc.Element("Data")
.Element(mainTagName)
.Element("Details")
.Element("Dataset");
string dataFilter = ((string) details.Attribute("se-datafilter")) ?? "";
string filterCondition= ((string) details.Attribute("dv-filtercondition")) ?? "";
string sortCol = ((string) details.Attribute("dv-sortcolumn")) ?? "";