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 |
一、建立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
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數據
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(); }
好用又簡單
基本查詢更加簡單,跟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也很是簡單,再也不廢話。直接給出簡單示例:
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(); }