LINQ to XML

1、LINQ to XML經常使用成員

  LINQ to XML的成員,javascript

  屬性列表:css

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

  方法列表:html

方法 說明
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

 

2、LINQ to XML各類類的基本操做

  一、建立XML元素java

  LINQ to XML使用XElement類建立XML元素。git

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

複製代碼
    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文件代碼以下:post

複製代碼
<?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以下:this

複製代碼
<?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>
複製代碼

  好用又簡單。spa

3、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個位置,不錯。

4、XML數據的輸入

  一、從文件中輸入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();
        }
複製代碼

  二、從字符串中輸入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();
        }
複製代碼

  好用又簡單

5、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查詢。

6、修改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();
        }
複製代碼

 

 

 
 
 
0
0
 
(請您對文章作出評價)
 
« 上一篇: Xml序列化
» 下一篇: TextReader/TextWriter 的類
相關文章
相關標籤/搜索