使用C#/.net 3.5从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>

如果我们有一个XML,比如:

<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")) ?? "";