使用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>

使用LINQ to xml读取xml

您试图将<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")

希望对你有帮助。

编辑:放弃这篇文章。