我有一个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”时,它可以正常工作。我在这里缺少什么
答案 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();