XML节点访问

时间:2011-03-26 06:09:16

标签: c# xml linq

我不确定我在这里缺少什么..我有一个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实际上返回了一个错误,但正如我上面说的那样,我在立即窗口中导航,似乎无法找到我需要的路径。 提前谢谢!

4 个答案:

答案 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;