使用LINQ to xml读取xml
本文关键字:xml 读取 to LINQ 使用 | 更新日期: 2023-09-27 18:04:46
我试图使用LINQ读取xml文件到xml,我的逻辑似乎很好,因为我在不同的应用程序中使用了相同的逻辑。但这次我得到"对象引用不设置为对象的实例。"错误,当我得到foreach循环。如有任何帮助,我将不胜感激。
c#逻辑StringBuilder s=new StringBuilder();
try
{
XDocument loaded = XDocument.Load(@"C:'logs'samplebrava.xml");
XName qualifiedName = XName.Get("Author", "http://www.infograph.com");
var xmlQuery = from b in loaded.Descendants(qualifiedName)
select new
{
Title = b.Element("Title").Value,
Author = b.Element("Author").Attribute("name").Value,
Comment = b.Element("Comment").Value
};
foreach (var item in xmlQuery)
s.AppendLine(item.Author + " - " + item.Title + " - " + item.Comment);
}
catch (Exception ex) { }
XML文件<?xml version="1.0" encoding="UTF-8"?>
<IGCMarkupDocument xmlns="http://www.infograph.com" majorversion="2" minorversion="6" revision="0">
<CDLInfo v1="3" v2="0" v3="2" v4="11">
<DriverInfo v1="1" v2="5" v3="2" v4="4">Emf2DL</DriverInfo>
<DriverFormatVersion>1</DriverFormatVersion>
</CDLInfo>
<PageList>
<Page index="0" left="0.0" bottom="0.0" right="42001.0" top="29701.0">
<AuthorList>
<Author name="gdfsuez'aiimiadmin">
<Changemark id="0" time="1311772228" guid="59B4A74788C31F4DA8D96AB4607499C0" color="255|0|0" hyperlink="" comment="">
<PointList pointcount="6">
<Point>
<x>5224.39</x>
<y>27153.1</y>
</Point>
<Point>
<x>2882.42</x>
<y>27153.1</y>
</Point>
<Point>
<x>2882.42</x>
<y>24785.4</y>
</Point>
<Point>
<x>4756</x>
<y>24785.4</y>
</Point>
<Point>
<x>5224.39</x>
<y>25259</y>
</Point>
<Point>
<x>4756</x>
<y>25259</y>
</Point>
</PointList>
<Title>MJ1</Title>
<Comment>Test</Comment>
<Viewstate Extents="false" ZoomWidth="true">
<Page>0</Page>
<ScaleFactor>0.0388562</ScaleFactor>
<Rotation>0.0</Rotation>
<EyePoint>
<x>21000.5</x>
<y>16369.8</y>
</EyePoint>
<DeviceRect>
<top>0</top>
<left>0</left>
<bottom>1037</bottom>
<right>1633</right>
</DeviceRect>
<LayerTable LayerCount="0"/>
</Viewstate>
</Changemark>
</Author>
</AuthorList>
</Page>
</PageList>
</IGCMarkupDocument>
您试图将<Author>
元素匹配为自己的子元素,并且<Title>
和<Comment>
元素不是<Author>
元素的直接子元素。
您还必须在所有元素查询中指定XML名称空间。您可以使用一个XNamespace实例来完成这个任务,只需要少量的样板代码:
XNamespace igc = "http://www.infograph.com";
var xmlQuery = from author in loaded.Descendants(igc + "Author")
select new {
Title = author.Descendants(igc + "Title").First().Value,
Author = author.Attribute("name").Value,
Comment = author.Descendants(igc + "Comment").First().Value
};
问题在于名称空间的使用。
您已经正确地创建了名称空间实例,但是要引用元素,您应该应用以下模式:
b.Element(qualifiedName + "Title")
希望对你有帮助。
编辑:放弃这篇文章。