LINQ to XML


一、LINQ to XML常用成員

  LINQ to XML的成員,

  屬性列表:

屬性 說明
Document 獲取此 XObject 的 XDocument
 EmptySequence  獲取空的元素集合
 FirstAttribute  獲取此元素的第一個屬性
 FirstNode  獲取此節點的第一個子節點
 HasAttributes  獲取一個值,該值指示此元素是否至少具有一個屬性
 HasElements  獲取一個值,該值指示此元素是否至少具有一個子元素
 IsEmpty  獲取一個值,該值指示此元素是否不包含內容
 LastAttribute  獲取此元素的最后一個屬性
 LastNode  獲取此節點的最后一個子節點
 Name  獲取或設置此元素的名稱
 NextNode  獲取此節點的下一個同級節點
 NodeType  獲取此節點的節點類型
 Parent  獲取此 XObject 的父級 XElement
 PreviousNode  獲取此節點的上一個同級節點
 Value  獲取或設置此元素的串連文本內容

  方法列表:

方法 說明
Add 將指定的內容添加為此 XContainer 的子級
AddAfterSelf 緊跟在此節點之后添加指定的內容
AddAnnotation 將對象添加到此 XObject 的批注列表
AddBeforeSelf  緊鄰此節點之前添加指定的內容
AddFirst 將指定的內容作為此文檔或元素的第一個子級添加
Ancestors 返回此節點的上級元素的集合
AncestorsAndSelf 返回元素集合,其中包含此元素及其上級
Annotation 從此 XObject 獲取指定類型的第一個批注對象
Annotations 獲取此 XObject 的指定類型的批注集合
Attribute 返回具有指定 XName 的此 XElement 的 XAttribute
Attributes 返回此元素的屬性集合
CreateReader 使用 readerOptions 參數指定的選項創建 XmlReader
CreateWriter 創建可用於將節點添加至 XContainer 的 XmlWriter
DescendantNodes 按文檔順序返回此文檔或元素的子代節點集合
DescendantNodesAndSelf 返回節點的集合,而這些節點包含此元素以及此元素的所有子代節點,並將它們按文檔順序排列
Descendants 按文檔順序返回此文檔或元素的子代元素集合
DescendantsAndSelf 返回元素的集合,而這些元素包含此元素以及此元素的所有子代元素,並按文檔順序排列它們
Elements 按文檔順序返回此元素或文檔的經過篩選的子元素集合
ElementsAfterSelf  按文檔順序返回此節點后的同級元素集合
ElementsBeforeSelf  按文檔順序返回此節點前的同級元素集合
GetDefaultNamespace  獲取此 XElement 的默認 XNamespace
GetNamespaceOfPrefix 獲取此 XElement 的與特定前綴關聯的命名空間
GetPrefixOfNamespace 獲取與此 XElement 的命名空間關聯的前綴
IsAfter  確定當前節點是否按文檔順序顯示在指定節點之后
IsBefore 確定當前節點是否按文檔順序顯示在指定節點之前
Load 從文件路徑、TextReader、XmlReader、Stream中加載Xml數據
Nodes 按文檔順序返回此元素或文檔的子節點集合
NodesAfterSelf 按文檔順序返回此節點后的同級節點的集合
NodesBeforeSelf 按文檔順序返回此節點前的同級節點的集合
Parse 從包含 XML 的字符串加載 XElement
Remove 從節點父級中刪除此節點
RemoveAll 從此 XElement 中移除節點和屬性
RemoveAnnotations 從此 XObject 移除指定類型的批注 
RemoveAttributes 移除此 XElement 的屬性
RemoveNodes 從此文檔或元素中移除子節點
ReplaceAll 使用指定的內容替換此元素的子節點和屬性
ReplaceAttributes 使用指定的內容替換此元素的屬性
ReplaceNodes 使用指定的內容替換此文檔或元素的子節點
ReplaceWith 使用指定的內容替換此節點
Save 將此元素序列化為文件、XmlWriter、TextWriter、Stream
SetAttributeValue 設置屬性的值、添加屬性或移除屬性
SetElementValue 設置子元素的值、添加子元素或移除子元素
SetValue 設置此元素的值
WriteTo 將此元素寫入 XmlWriter

 

二、LINQ to XML各種類的基本操作

  1、創建XML元素

  LINQ to XML使用XElement類創建XML元素。

  先來看一個最基本的示例:

    class Program
    {
        static void Main(string[] args)
        {
            XElement xml =
                new XElement("Persons",
                    new XElement("Person",
                        new XElement("Name", "劉備"),
                        new XElement("Age", "28")
                        ),
                    new XElement("Person",
                        new XElement("Name", "關羽"),
                        new XElement("Age", "27")
                        )
                    );
            xml.Save(@"D:\123.xml");

            Console.ReadKey();
        }
    }

  以上代碼生成的XML文件代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Persons>
  <Person>
    <Name>劉備</Name>
    <Age>28</Age>
  </Person>
  <Person>
    <Name>關羽</Name>
    <Age>27</Age>
  </Person>
</Persons>

  非常簡單的,下面給出一個非常全面的示例,包括XML大部分的節點類型。

    class Program
    {
        static void Main(string[] args)
        {
            //創建處理指令
            XProcessingInstruction instruction = new XProcessingInstruction("xml-stylesheet","href=\"hello.css\" type = \"text/css\"");
            //創建聲明對象
            XDeclaration xDeclaration = new XDeclaration("1.0","GB2312","yes");
            //創建文檔類型
            XDocumentType documentType = new XDocumentType("Person", null, "Person.dtd", null);
            //創建XmlCData數據
            XCData data = new XCData("<h1>神奇的劉備</h1>");
            //創建XDocument文檔
            XDocument xDoc = new XDocument();
            XElement xml =
                new XElement("Persons",
                    new XElement("Person",
                        new XAttribute("Description", "此人龍鳳之姿 天日之表;"),
                        new XElement("Name", data),
                        new XElement("Age", "28")
                        ),
                    new XElement("Person",
                        new XElement("Name", "關羽"),
                        new XElement("Age", "27")
                        )
                    );
            xDoc.Add(documentType);
            xDoc.Add(instruction);
            xDoc.Declaration = xDeclaration;
            xDoc.Add(xml);
            
            xDoc.Save(@"D:\123.xml");

            Console.ReadKey();
        }
    }

  以上代碼輸出XML如下:

<?xml version="1.0" encoding="gb2312" standalone="yes"?>
<!DOCTYPE Person SYSTEM "Person.dtd">
<?xml-stylesheet href="hello.css" type = "text/css"?>
<Persons>
  <Person Description="此人龍鳳之姿 天日之表;">
    <Name><![CDATA[<h1>神奇的劉備</h1>]]></Name>
    <Age>28</Age>
  </Person>
  <Person>
    <Name>關羽</Name>
    <Age>27</Age>
  </Person>
</Persons>

  好用又簡單。

三、XML數據的輸出

  XElement有個Save,這個Save非常強大,有多種重載,支持將XML數據輸入到各處(文件地址,流,TextWriter,XmlWriter)。

    class Program
    {
        static void Main(string[] args)
        {
            XElement xml =
                new XElement("Persons",
                    new XElement("Person",
                        new XElement("Name", "劉備"),
                        new XElement("Age", "28")
                        )
                    );
            //輸出到文件
            xml.Save(@"D:\123.xml");
            //輸出到TextWriter
            TextWriter tw = new StringWriter();
            //第二個參數SaveOptions枚舉支持設置格式,縮進,保留無關重要的空白,去除重復命名空間
            xml.Save(tw, SaveOptions.None);
            Console.WriteLine(tw);
            //輸出到Stream
            using (MemoryStream mem = new MemoryStream())
            {
                xml.Save(mem);
                Console.WriteLine(Encoding.UTF8.GetString(mem.ToArray()));
            }
            //輸出到XmlWriter
            XmlWriter xw = XmlWriter.Create(@"D:\LinqToXml.xml");
            
            xml.Save(xw);
            xw.Flush();
            Console.ReadKey();
        }
    }

  一個DEMO完成輸出到4個位置,不錯。

四、XML數據的輸入

  1、從文件中輸入XML數據

  XML數據的輸出強大,XML數據的輸入也同樣強大,擁有多個重載的Load支持從URI,TextWriter,XmlReader輸入XML數據。

        static void Main(string[] args)
        {
            //從URI中獲取XML數據,支持本地路徑和URL,支持對應枚舉的設置
            XElement xe1 = XElement.Load(@"D:\123.xml",LoadOptions.None);
            //從XmlReader中加載
            XmlReader xr = XmlReader.Create(@"D:\123.xml");
            XElement xe2 = XElement.Load(xr);
            //從TextReader中獲取數據
            TextReader reader = File.OpenText(@"D:\123.xml");
            XElement xe3 = XElement.Load(reader);
            //從Stream中讀取
            XElement xe4 = XElement.Load(new FileStream(@"D:\123.xml",FileMode.Open,FileAccess.Read));

            Console.ReadKey();
        }

  2、從字符串中輸入XML數據

  從字符串中解析數據為XML,只需要使用Parse方法。

        static void Main(string[] args)
        {
            string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Persons><Person><Name>劉備</Name><Age>28</Age></Person></Persons>";
            XElement xe = XElement.Parse(xmlString,LoadOptions.SetLineInfo);

            Console.ReadKey();
        }

  好用又簡單

五、XML基本查詢

   基本查詢更加簡單,跟jQuery選擇器差不多,鏈式操作。

        static void Main(string[] args)
        {
            string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Persons><Person Description=\"牛人\"><Name>劉備</Name><Age>28</Age></Person></Persons>";
            XElement xe = XElement.Parse(xmlString,LoadOptions.SetLineInfo);
            //讀取屬性值
            string ArriValue = xe.Elements("Person").First().Attribute("Description").Value;
            //又或者
            //string ArriValue = xe.Element("Person").Attribute("Description").Value;
            Console.WriteLine(ArriValue);   //輸出 牛人

            //讀取元素  讀取Name的后面的第一個兄弟元素
            XElement xe1 = xe.Element("Person").Element("Name").ElementsAfterSelf().First();
            Console.WriteLine(xe1.Value);   //輸出 28
            //讀取父節點
            XElement xe2 = xe1.Parent;
            Console.WriteLine(xe2.Name);

            Console.ReadKey();
        }

  其他查詢:

        static void Main(string[] args)
        {
            string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Persons><Person Description=\"牛人\"><Name>劉備</Name><Age>28</Age></Person><Person><Name>關羽</Name><Age>26</Age></Person></Persons>";
            XElement xe = XElement.Parse(xmlString, LoadOptions.SetLineInfo);
            //查詢含有屬性的Person節點
            List<XElement> ListElement = xe.Descendants("Person").Where(x => x.HasAttributes).ToList();
            foreach (XElement x in ListElement)
            {
                Console.WriteLine(x.Value);     //輸出 劉備28
            }
            //查詢年齡為26的Person的Person節點
            List<XElement> ListElement2 = xe.Descendants("Person").Where(x => x.Element("Age").Value == "26").ToList();
            foreach (XElement x in ListElement2)
            {
                Console.WriteLine(x.Value);     //輸出 關羽26
            }
            Console.ReadKey();
        }

  Nodes、Descendants以及各自的AfterSelf用於轉成IEnumerable<T>的LINQ查詢。

六、修改XML

   修改XML也非常簡單,不再廢話。直接給出簡單示例:

        static void Main(string[] args)
        {
            string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Persons><Person Description=\"牛人\"><Name>劉備</Name><Age>28</Age></Person></Persons>";
            XElement xe = XElement.Parse(xmlString, LoadOptions.SetLineInfo);

            //這是添加在最后,如果想添加在最前面可以使用AddFirst,
            //添加在本節點之前AddBeforSelf,添加在本節點之后AddAfterSelf
            xe.Add(new XElement("Person",
                        new XElement("Name", "關羽"),
                        new XElement("Age", 26)
                    )
                );
            //刪除所有子節點
            xe.RemoveAll();

            TextWriter tw = new StringWriter();
            //第二個參數SaveOptions枚舉支持設置格式,縮進,保留無關重要的空白,去除重復命名空間
            xe.Save(tw, SaveOptions.None);
            Console.WriteLine(tw);

            Console.ReadKey();
        }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM