访问xml节点时出错

时间:2012-07-19 07:48:04

标签: c# xml linq

我有一个xml如下

<Students xmlns="http://AdapterTest">
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
    <ElementType name="Student" content="empty" model="closed">
        <AttributeType name="Student_id" dt:type="string"/>
        <AttributeType name="Student_Name" dt:type="string"/>
        <attribute type="Student_id"/>
        <attribute type="Student_Name"/>
    </ElementType>
</Schema>
<Student Student_id="123456" Student_Name="Udaya" xmlns="x-schema:#Schema1"/>
<Student Student_id="568923" Student_Name="Christie" xmlns="x-schema:#Schema1"/>
<Student Student_id="741852" Student_Name="Test Name" xmlns="x-schema:#Schema1"/>
<Student Student_id="852789" Student_Name="Sample Name" xmlns="x-schema:#Schema1"/>
</Students>

在我的应用程序中,我尝试使用LINQ访问节点,如下所示。

XDocument xdoc1 = XDocument.Load("Customer.xml");

        List<Student> studentList =
            (from _student in xdoc1.Element("Students").Elements("Student")
             select new Student
             {
                 firstName = _student.Attribute("Student_id").Value,
                 lastName = _student.Attribute("Student_Name").Value,


             }).ToList();

它为我提供了一个未设置为对象实例的Object引用。当我从根元素中删除xmlns =“http:// AdapterTest”时,它可以正常工作。我在这里缺少什么

3 个答案:

答案 0 :(得分:1)

我之前遇到过类似的问题。就像你说的,如果你从xml中删除命名空间就可以了。你必须做这样的事情:

XNamespace rootNs = xdoc1.Root.Name.Namespace;
XNamespace studentNS = "x-schema:#Schema1";

然后在选择节点时,用ns添加选择器,如:

var yourStudentList = xdoc1.Element(rootNS + "Student").Elements(studentNS + "Student");

我没有对此进行测试,但它看起来和我遇到的问题类似。

答案 1 :(得分:1)

添加名称空间:

        XNamespace ns1 = xdoc1.Root.GetDefaultNamespace();
        XNamespace ns2 = "x-schema:#Schema1";

并在检索元素时使用它们:

        List<Student> studentList =
            (from _student in xdoc1.Element(ns1 + "Students")
                                   .Elements(ns2 + "Student")
             select new Student
             {
                 firstName = _student.Attribute("Student_id").Value,
                 lastName = _student.Attribute("Student_Name").Value,
             }).ToList();

你将获得包含四个元素的列表。

答案 2 :(得分:0)

您需要为LINQ定义命名空间。

XDocument xdoc1 = XDocument.Load("Customer.xml");
XNamespace ns = "http://AdapterTest"; //definine namespace

    List<Student> studentList =
        (from _student in xdoc1.Element(ns + "Students").Elements("Student")
         select new Student
         {
             firstName = _student.Attribute("Student_id").Value,
             lastName = _student.Attribute("Student_Name").Value,


         }).ToList();