我不确定我在这里缺少什么..我有一个XML文件,它有几个节点..特别是我试图得到节点的LocalName是“Requirement”的后代。我已经尝试了我能想到的每一个组合,并且无法让它让我访问节点。当我检查要求是否有元素时,我得到了......当我检查它是否有后代时 - 我得到了错误。
这是XML
<Requirement type="Level"><gt>11</gt></Requirement>
编辑@ Jon - 我的问题是如何访问“GT”节点? (它可以改为其他项目,所以我不想直接引用它。)
到目前为止,这是我的代码:
public override void LoadXml(XElement element)
{
Value = element.Value;
EquateType = element.LastNode.Parent.Name.LocalName;
}
EquateType是我试图修改的字段... LastNode实际上返回了一个错误,但正如我上面说的那样,我在立即窗口中导航,似乎无法找到我需要的路径。 提前谢谢!
答案 0 :(得分:1)
或者你可以使用XPAth ..
编辑:
XmlNode node= doc.SelectSingleNode("/Requirement//*"); //returns first occurence
string name = node.Name; //tada!
<击> XmlNodeList list = doc.SelectNodes("/Requirement//gt");
//selects a
occuring anywhere within Requirement
。击>
EDIT2 :要从XELement
转换为XmlNode
,您可以..
第1步:使用XmlReader
方法创建CreateReader()
。
第2步:然后使用XmlDocument
返回的XmlReader
加载CreateReader()
。
第3步:将XmlDocument
作为XMlNode
返回,因为 XmlDocument
继承XmlNode
。:)
您的代码应该是以下内容..
public static XmlNode GetXmlNode(this XElement element)
{
using (XmlReader xmlReader = element.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
return xmlDoc;
}
}
答案 1 :(得分:0)
试试这个
var items = doc.Descendants("Requirement")
.Where(node => (string)node.Name == "gt")
.Select(node => node.Value.ToString())
.ToList();
答案 2 :(得分:0)
如果您使用的是XDocument
,则文档中位于Requirement
元素下的第一个元素是:
XElement e = d.Descendants("Requirement").Elements().First();
您可以访问其LocalName
属性以获取其本地名称。 (注意使用Elements
,它返回直接子元素,而不是Descendants
,它返回所有后代元素。在这种情况下无关紧要,因为第一个子元素和第一个后代元素是同样的事情,但是当你只是在寻找子元素时不加选择地使用Descendants
会让你陷入麻烦。)
如果您想使用XPath,您可以:
XElement e = d.XPathSelectElement("//Requirement/*");
答案 3 :(得分:0)
非常感谢大家和他们的帮助。我最终能够使用Linq来实现这一点。
EquateType = element.Elements().First().Name.LocalName;