如何获取节点属性?因此,我使用Linq To Xml来解析文件。 我试着这样做:
// load doc and then give elements.
XDocument doc = XDocument.Load(pathToFile);
var elem = doc.Root
.Elements("mode")
.Where(o => o.Attribute("name") != null)
.Elements("file")
.Where(k => k.Attribute("name") !=null && k.Attribute("name").Value == filenameTag)
.Elements("model")
.Where(o => o.Attribute("name") != null)
.Elements("class")
.Where(c => c.Attribute("name") != null);
foreach (var el in elem)
{
Console.WriteLine("First Attribute "+el.FirstAttribute.ToString());
Console.WriteLine("Name "+el.Name);
Console.WriteLine("Last Attribute " + el.LastAttribute.ToString());
var nodes=el.Nodes();
foreach (var node in nodes)
{
Console.WriteLine("node "+node.ToString());
}
}
Xml文件:
<modes>
<mode name="mode1">
<file name="file1.xml">
<model name="Config" AllClasses="false">
<ignore.class class="class5"/>
<class name="class1" allProprs="true"/>
<class name="class2" allProps="false">
<property name="pr1"/>
<ignore.property property="pr2"/>
</class>
</model>
</file>
</mode>
</modes>
所以,我只得到这样的字符串:
node <property name="pr1" />
node <ignore.property property="pr2" />
但如何获得价值&#34; pr1&#34;和&#34; pr2&#34;?
谢谢!
答案 0 :(得分:2)
在显示时:
node <property name="pr1" />
node <ignore.property property="pr2" />
您正在迭代<class>
。如果要获取子元素的属性,则询问子元素的属性:
foreach (var attrib in el.Elements().Attributes())
{
Console.WriteLine("node " + (string)attrib);
}
根据要求输出pr1
和pr2
答案 1 :(得分:1)
您的问题是您只需编写类的内部元素的ToString表示。这为您提供了属性元素的全部内容。但是你应该得到每个属性元素的第一个属性的值:
var xdoc = XDocument.Load(path_to_xml);
string filenameTag = "file1.xml";
var classes = xdoc.Descendants("file")
.Where(f => (string)f.Attribute("name") == filenameTag)
.Elements("model")
.Where(m => (string)m.Attribute("name") != null)
.Elements("class")
.Where(c => (string)c.Attribute("name") != null);
foreach (var c in classes)
{
Console.WriteLine("Name: " + (string)c.Attribute("name"));
foreach(var p in c.Elements())
Console.WriteLine("Property: " + (string)p.Attributes().FirstOrDefault());
}
输出:
Name: class1
Name: class2
Property: pr1
Property: pr2
BTW用XPath编写这个查询要容易得多:
string xpath = String.Format("//file[@name='{0}']/model[@name]/class[@name]", filenameTag);
var classes = xdoc.XPathSelectElements(xpath);
答案 2 :(得分:0)
您可以使用XPath查询并询问XML文档。另一个选择是获取XmlNode,然后从节点中提取属性。
它不是LINQ,但它有效。