一、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(); }
