Linq to XML同樣是對原C#訪問XML文件的方法的封裝,簡化了用xpath進行xml的查詢以及增加,修改,刪除xml元素的操作。
LINQ to XML 三個最重要類:XElement、XAttribute 和 XDocument。
首先我們先介紹這三個類的基本屬性和方法,然後再實現Linq to XML的 增刪改查。
1.XDocument
構造函數 名稱 說明 XElement(XElement) 從其他 XElement 對象初始化 XElement 類的新實例。 XElement(XName) 用指定的名稱初始化 XElement 類的新實例。 XElement(XStreamingElement) 從 XStreamingElement 對象初始化 XElement 類的新實例。 XElement(XName, Object) 用指定的名稱和內容初始化 XElement 類的新實例。 XElement(XName, Object[]) 用指定的名稱和內容初始化 XElement 類的新實例。 屬性 名稱 說明 BaseUri 獲取此 XObject 的基 URI。 (繼承自 XObject。) Document 獲取此 XObject 的 XDocument。 (繼承自 XObject。) EmptySequence 獲取空的元素集合。 FirstAttribute 獲取此元素的第一個屬性。 FirstNode 獲取此節點的第一個子節點。 (繼承自 XContainer。) HasAttributes 獲取一個值,該值指示此元素是否至少具有一個屬性。 HasElements 獲取一個值,該值指示此元素是否至少具有一個子元素。 IsEmpty 獲取一個值,該值指示此元素是否不包含內容。 LastAttribute 獲取此元素的最後一個屬性。 LastNode 獲取此節點的最後一個子節點。 (繼承自 XContainer。) Name 獲取或設置此元素的名稱。 NextNode 獲取此節點的下一個同級節點。 (繼承自 XNode。) NodeType 獲取此節點的節點類型。 (重寫 XObject.NodeType。) Parent 獲取此 XObject 的父級 XElement。 (繼承自 XObject。) PreviousNode 獲取此節點的上一個同級節點。 (繼承自 XNode。) Value 獲取或設置此元素的串連文本內容。 方法 名稱 說明 Add(Object) 將指定的內容添加為此 XContainer 的子級。 (繼承自 XContainer。) Add(Object[]) 將指定的內容添加為此 XContainer 的子級。 (繼承自 XContainer。) AddAfterSelf(Object) 緊跟在此節點之後添加指定的內容。 (繼承自 XNode。) AddAfterSelf(Object[]) 緊跟在此節點之後添加指定的內容。 (繼承自 XNode。) AddAnnotation 將對象添加到此 XObject 的批注列表。 (繼承自 XObject。) AddBeforeSelf(Object) 緊鄰此節點之前添加指定的內容。 (繼承自 XNode。) AddBeforeSelf(Object[]) 緊鄰此節點之前添加指定的內容。 (繼承自 XNode。) AddFirst(Object) 將指定的內容作為此文檔或元素的第一個子級添加。 (繼承自 XContainer。) AddFirst(Object[]) 將指定的內容作為此文檔或元素的第一個子級添加。 (繼承自 XContainer。) Ancestors() 返回此節點的上級元素的集合。 (繼承自 XNode。) Ancestors(XName) 返回此節點的經過篩選的上級元素的集合。 集合中只包括具有匹配 XName 的元素。 (繼承自 XNode。) AncestorsAndSelf() 返回元素集合,其中包含此元素及其上級。 AncestorsAndSelf(XName) 返回經過篩選的元素集合,其中包含此元素及其上級。 集合中只包括具有匹配 XName 的元素。 Annotation(Type) 從此 XObject 獲取指定類型的第一個批注對象。 (繼承自 XObject。) Annotation<T>() 從此 XObject 獲取指定類型的第一個批注對象。 (繼承自 XObject。) Annotations(Type) 獲取此 XObject 的指定類型的批注集合。 (繼承自 XObject。) Annotations<T>() 獲取此 XObject 的指定類型的批注集合。 (繼承自 XObject。) Attribute 返回具有指定 XName 的此 XElement 的 XAttribute。 Attributes() 返回此元素的屬性集合。 Attributes(XName) 返回經過篩選的此元素的屬性集合。 集合中只包括具有匹配 XName 的元素。 CreateReader() 創建此節點的 XmlReader。 (繼承自 XNode。) CreateReader(ReaderOptions) 使用 readerOptions 參數指定的選項創建 XmlReader。 (繼承自 XNode。) CreateWriter 創建可用於將節點添加至 XContainer 的 XmlWriter。 (繼承自 XContainer。) DescendantNodes 按文檔順序返回此文檔或元素的子代節點集合。 (繼承自 XContainer。) DescendantNodesAndSelf 返回節點的集合,而這些節點包含此元素以及此元素的所有子代節點,並將它們按文檔順序排列。 Descendants() 按文檔順序返回此文檔或元素的子代元素集合。 (繼承自 XContainer。) Descendants(XName) 按文檔順序返回此文檔或元素的經過篩選的子代元素集合。 集合中只包括具有匹配 XName 的元素。 (繼承自 XContainer。) DescendantsAndSelf() 返回元素的集合,而這些元素包含此元素以及此元素的所有子代元素,並按文檔順序排列它們。 DescendantsAndSelf(XName) 返回經過篩選的元素集合,這些元素包含此元素以及此元素的所有子代元素,並按文檔順序排列它們。 集合中只包括具有匹配 XName 的元素。 Element 獲取具有指定 XName 的第一個(按文檔順序)子元素。 (繼承自 XContainer。) Elements() 按文檔順序返回此元素或文檔的子元素集合。 (繼承自 XContainer。) Elements(XName) 按文檔順序返回此元素或文檔的經過篩選的子元素集合。 集合中只包括具有匹配 XName 的元素。(繼承自 XContainer。) ElementsAfterSelf() 按文檔順序返回此節點後的同級元素集合。 (繼承自 XNode。) ElementsAfterSelf(XName) 按文檔順序返回此節點後經過篩選的同級元素的集合。 集合中只包括具有匹配 XName 的元素。(繼承自 XNode。) ElementsBeforeSelf() 按文檔順序返回此節點前的同級元素集合。 (繼承自 XNode。) ElementsBeforeSelf(XName) 按文檔順序返回此節點前經過篩選的同級元素的集合。 集合中只包括具有匹配 XName 的元素。(繼承自 XNode。) GetDefaultNamespace 獲取此 XElement 的默認 XNamespace。 GetNamespaceOfPrefix 獲取此 XElement 的與特定前綴關聯的命名空間。 GetPrefixOfNamespace 獲取與此 XElement 的命名空間關聯的前綴。 IsAfter 確定當前節點是否按文檔順序顯示在指定節點之後。 (繼承自 XNode。) IsBefore 確定當前節點是否按文檔順序顯示在指定節點之前。 (繼承自 XNode。) Load(Stream) 使用指定的流創建一個新的 XElement 實例。 Load(String) 從文件加載 XElement。 Load(TextReader) 從 TextReader 加載 XElement。 Load(XmlReader) 從 XmlReader 加載 XElement。 Load(Stream, LoadOptions) 使用指定流創建新的 XElement 實例,也可以選擇保留空白,設置基 URI 和保留行信息。 Load(String, LoadOptions) 從文件加載 XElement,還可以選擇保留空白、設置基 URI 和保留行信息。 Load(TextReader, LoadOptions) 從 TextReader 加載 XElement,還可以選擇保留空白和行信息。 Load(XmlReader, LoadOptions) 從 XmlReader 加載 XElement 時,可以選擇保留空白、設置基 URI 和保留行信息。 Nodes 按文檔順序返回此元素或文檔的子節點集合。 (繼承自 XContainer。) NodesAfterSelf 按文檔順序返回此節點後的同級節點的集合。 (繼承自 XNode。) NodesBeforeSelf 按文檔順序返回此節點前的同級節點的集合。 (繼承自 XNode。) Parse(String) 從包含 XML 的字符串加載 XElement。 Parse(String, LoadOptions) 從包含 XML 的字符串加載 XElement,還可以選擇保留空白和行信息。 Remove 從節點父級中刪除此節點。 (繼承自 XNode。) RemoveAll 從此 XElement 中移除節點和屬性。 RemoveAnnotations(Type) 從此 XObject 移除指定類型的批注。 (繼承自 XObject。) RemoveAnnotations<T>() 從此 XObject 移除指定類型的批注。 (繼承自 XObject。) RemoveAttributes 移除此 XElement 的屬性。 RemoveNodes 從此文檔或元素中移除子節點。 (繼承自 XContainer。) ReplaceAll(Object) 使用指定的內容替換此元素的子節點和屬性。 ReplaceAll(Object[]) 使用指定的內容替換此元素的子節點和屬性。 ReplaceAttributes(Object) 使用指定的內容替換此元素的屬性。 ReplaceAttributes(Object[]) 使用指定的內容替換此元素的屬性。 ReplaceNodes(Object) 使用指定的內容替換此文檔或元素的子節點。 (繼承自 XContainer。) ReplaceNodes(Object[]) 使用指定的內容替換此文檔或元素的子節點。 (繼承自 XContainer。) ReplaceWith(Object) 使用指定的內容替換此節點。 (繼承自 XNode。) ReplaceWith(Object[]) 使用指定的內容替換此節點。 (繼承自 XNode。) Save(Stream) 將此 XElement 輸出到指定的 Stream。 Save(String) 將此元素序列化為文件。 Save(TextWriter) 將此元素序列化為 TextWriter。 Save(XmlWriter) 將此元素序列化為 XmlWriter。 Save(Stream, SaveOptions) 將此 XElement 輸出到指定的 Stream,(可選)並指定格式設置行為。 Save(String, SaveOptions) 將此元素序列化為文件,並可以選擇禁用格式設置。 Save(TextWriter, SaveOptions) 將此元素序列化為 TextWriter,並可以選擇禁用格式設置。 SetAttributeValue 設置屬性的值、添加屬性或移除屬性。 SetElementValue 設置子元素的值、添加子元素或移除子元素。 SetValue 設置此元素的值。 ToString() 返回此節點的縮進 XML。 (繼承自 XNode。) ToString(SaveOptions) 返回此節點的 XML,還可以選擇禁用格式設置。 (繼承自 XNode。) WriteTo 將此元素寫入 XmlWriter。 (重寫 XNode.WriteTo(XmlWriter)。) View Code
2.XElement
構造函數 名稱 說明 XDocument() 初始化 XDocument 類的新實例。 XDocument(Object[]) 使用指定的內容初始化 XDocument 類的新實例。 XDocument(XDocument) 從現有的 XDocument 對象初始化 XDocument 類的新實例。 XDocument(XDeclaration, Object[]) 用指定的 XDeclaration 和內容初始化 XDocument 類的新實例。 屬性 名稱 說明 BaseUri 獲取此 XObject 的基 URI。 (繼承自 XObject。) Declaration 獲取或設置此文檔的 XML 聲明。 Document 獲取此 XObject 的 XDocument。 (繼承自 XObject。) DocumentType 獲取此文檔的文檔類型定義 (DTD)。 FirstNode 獲取此節點的第一個子節點。 (繼承自 XContainer。) LastNode 獲取此節點的最後一個子節點。 (繼承自 XContainer。) NextNode 獲取此節點的下一個同級節點。 (繼承自 XNode。) NodeType 獲取此節點的節點類型。 (重寫 XObject.NodeType。) Parent 獲取此 XObject 的父級 XElement。 (繼承自 XObject。) PreviousNode 獲取此節點的上一個同級節點。 (繼承自 XNode。) Root 獲取此文檔的 XML 樹的根元素。 方法 名稱 說明 Add(Object) 將指定的內容添加為此 XContainer 的子級。 (繼承自 XContainer。) Add(Object[]) 將指定的內容添加為此 XContainer 的子級。 (繼承自 XContainer。) AddAfterSelf(Object) 緊跟在此節點之後添加指定的內容。 (繼承自 XNode。) AddAfterSelf(Object[]) 緊跟在此節點之後添加指定的內容。 (繼承自 XNode。) AddAnnotation 將對象添加到此 XObject 的批注列表。 (繼承自 XObject。) AddBeforeSelf(Object) 緊鄰此節點之前添加指定的內容。 (繼承自 XNode。) AddBeforeSelf(Object[]) 緊鄰此節點之前添加指定的內容。 (繼承自 XNode。) AddFirst(Object) 將指定的內容作為此文檔或元素的第一個子級添加。 (繼承自 XContainer。) AddFirst(Object[]) 將指定的內容作為此文檔或元素的第一個子級添加。 (繼承自 XContainer。) Ancestors() 返回此節點的上級元素的集合。 (繼承自 XNode。) Ancestors(XName) 返回此節點的經過篩選的上級元素的集合。 集合中只包括具有匹配 XName 的元素。 (繼承自 XNode。) Annotation(Type) 從此 XObject 獲取指定類型的第一個批注對象。 (繼承自 XObject。) Annotation<T>() 從此 XObject 獲取指定類型的第一個批注對象。 (繼承自 XObject。) Annotations(Type) 獲取此 XObject 的指定類型的批注集合。 (繼承自 XObject。) Annotations<T>() 獲取此 XObject 的指定類型的批注集合。 (繼承自 XObject。) CreateReader() 創建此節點的 XmlReader。 (繼承自 XNode。) CreateReader(ReaderOptions) 使用 readerOptions 參數指定的選項創建 XmlReader。 (繼承自 XNode。) CreateWriter 創建可用於將節點添加至 XContainer 的 XmlWriter。 (繼承自 XContainer。) DescendantNodes 按文檔順序返回此文檔或元素的子代節點集合。 (繼承自 XContainer。) Descendants() 按文檔順序返回此文檔或元素的子代元素集合。 (繼承自 XContainer。) Descendants(XName) 按文檔順序返回此文檔或元素的經過篩選的子代元素集合。 集合中只包括具有匹配 XName 的元素。 (繼承自 XContainer。) Element 獲取具有指定 XName 的第一個(按文檔順序)子元素。 (繼承自 XContainer。) Elements() 按文檔順序返回此元素或文檔的子元素集合。 (繼承自 XContainer。) Elements(XName) 按文檔順序返回此元素或文檔的經過篩選的子元素集合。 集合中只包括具有匹配 XName 的元素。 (繼承自 XContainer。) ElementsAfterSelf() 按文檔順序返回此節點後的同級元素集合。 (繼承自 XNode。) ElementsAfterSelf(XName) 按文檔順序返回此節點後經過篩選的同級元素的集合。 集合中只包括具有匹配 XName 的元素。 (繼承自 XNode。) ElementsBeforeSelf() 按文檔順序返回此節點前的同級元素集合。 (繼承自 XNode。) ElementsBeforeSelf(XName) 按文檔順序返回此節點前經過篩選的同級元素的集合。 集合中只包括具有匹配 XName 的元素。 (繼承自 XNode。) IsAfter 確定當前節點是否按文檔順序顯示在指定節點之後。 (繼承自 XNode。) IsBefore 確定當前節點是否按文檔順序顯示在指定節點之前。 (繼承自 XNode。) Load(Stream) 使用指定的流創建一個新的 XDocument 實例。 Load(String) 從文件創建新 XDocument。 Load(TextReader) 從 TextReader 創建新的 XDocument。 Load(XmlReader) 從 XmlReader 創建新 XDocument。 Load(Stream, LoadOptions) 使用指定流創建新的 XDocument 實例,也可以選擇保留空白,設置基 URI 和保留行信息。 Load(String, LoadOptions) 從文件創建新 XDocument,還可以選擇保留空白和行信息以及設置基 URI。 Load(TextReader, LoadOptions) 從 TextReader 創建新 XDocument,還可以選擇保留空白和行信息以及設置基 URI。 Load(XmlReader, LoadOptions) 從 XmlReader 加載 XDocument,還可以選擇設置基 URI 和保留行信息。 Nodes 按文檔順序返回此元素或文檔的子節點集合。 (繼承自 XContainer。) NodesAfterSelf 按文檔順序返回此節點後的同級節點的集合。 (繼承自 XNode。) NodesBeforeSelf 按文檔順序返回此節點前的同級節點的集合。 (繼承自 XNode。) Parse(String) 從字符串創建新 XDocument。 Parse(String, LoadOptions) 從字符串創建新 XDocument,還可以選擇保留空白和行信息以及設置基 URI。 Remove 從節點父級中刪除此節點。 (繼承自 XNode。) RemoveAnnotations(Type) 從此 XObject 移除指定類型的批注。 (繼承自 XObject。) RemoveAnnotations<T>() 從此 XObject 移除指定類型的批注。 (繼承自 XObject。) RemoveNodes 從此文檔或元素中移除子節點。 (繼承自 XContainer。) ReplaceNodes(Object) 使用指定的內容替換此文檔或元素的子節點。 (繼承自 XContainer。) ReplaceNodes(Object[]) 使用指定的內容替換此文檔或元素的子節點。 (繼承自 XContainer。) ReplaceWith(Object) 使用指定的內容替換此節點。 (繼承自 XNode。) ReplaceWith(Object[]) 使用指定的內容替換此節點。 (繼承自 XNode。) Save(Stream) 將此 XDocument 輸出到指定的 Stream。 Save(String) 序列化此 XDocument 到文件,如果該文件存在,則覆蓋現有的文件。 Save(TextWriter) 將此 XDocument 序列化為 TextWriter。 Save(XmlWriter) 將此 XDocument 序列化為 XmlWriter。 Save(Stream, SaveOptions) 將此 XDocument 輸出到指定的 Stream,(可選)並指定格式設置行為。 Save(String, SaveOptions) 將此 XDocument 序列化為文件,還可以選擇禁用格式設置。 Save(TextWriter, SaveOptions) 將此 XDocument 序列化為 TextWriter,還可以選擇禁用格式設置。 ToString() 返回此節點的縮進 XML。 (繼承自 XNode。) ToString(SaveOptions) 返回此節點的 XML,還可以選擇禁用格式設置。 (繼承自 XNode。) WriteTo 將此文檔寫入 XmlWriter。 (重寫 XNode.WriteTo(XmlWriter)。) View Code
3.XAttribute
構造函數 名稱 說明 XAttribute(XAttribute) 從其他 XAttribute 對象初始化 XAttribute 類的新實例。 XAttribute(XName, Object) 從指定的名稱和值初始化 XAttribute 類的新實例。 屬性 名稱 說明 BaseUri 獲取此 XObject 的基 URI。 (繼承自 XObject。) Document 獲取此 XObject 的 XDocument。 (繼承自 XObject。) EmptySequence 獲取空的屬性集合。 IsNamespaceDeclaration 確定此屬性是否為命名空間聲明。 Name 獲取此屬性 (Attribute) 的展開名稱。 NextAttribute 獲取父元素的下一個屬性 (Attribute)。 NodeType 獲取此節點的節點類型。 (重寫 XObject.NodeType。) Parent 獲取此 XObject 的父級 XElement。 (繼承自 XObject。) PreviousAttribute 獲取父元素的上一個屬性 (Attribute)。 Value 獲取或設置此屬性的值。 方法 名稱 說明 AddAnnotation 將對象添加到此 XObject 的批注列表。 (繼承自 XObject。) Annotation(Type) 從此 XObject 獲取指定類型的第一個批注對象。 (繼承自 XObject。) Annotation<T>() 從此 XObject 獲取指定類型的第一個批注對象。 (繼承自 XObject。) Annotations(Type) 獲取此 XObject 的指定類型的批注集合。 (繼承自 XObject。) Annotations<T>() 獲取此 XObject 的指定類型的批注集合。 (繼承自 XObject。) Remove 從此屬性的父元素中移除它。 RemoveAnnotations(Type) 從此 XObject 移除指定類型的批注。 (繼承自 XObject。) RemoveAnnotations<T>() 從此 XObject 移除指定類型的批注。 (繼承自 XObject。) SetValue 設置此屬性的值。 ToString 將當前的 XAttribute 對象轉換為字符串表示形式。 (重寫 Object.ToString()。) View Code
簡單示例
1.創建XML
XDocument doc = new XDocument( ///創建XDocument類的實例 new XDeclaration("1.0", "utf-8", "yes"),///XML的聲明,包括版本,編碼,xml文件是否獨立 new XElement("Books", ///添加根節點 new XElement("Book", ///添加一個節點 new XAttribute("BookID", "001"),///添加屬性BookID new XElement("BookNo", "0001"), ///添加元素BookNo new XElement("BookName", "Book 0001"),///添加元素BookName new XElement("BookPrice", "40"),///添加元素BookPrice new XElement("BookRemark", "This is a book 0001")///添加元素BookRemark ) ) ); ///保存XML文件到指定地址 doc.Save(@"C:\Books.xml");
2.添加元素
///導入XML文件 XElement xe = XElement.Load(@"C:\Books.xml"); ///創建一個新節點 XElement book1 = new XElement("Book", new XAttribute("BookID", "002"), new XElement("BookNo", "0002"), new XElement("BookName", "Book 0002"), new XElement("BookPrice", "50"), new XElement("BookRemark", "This is a book 0002") ); ///添加節點到XML文件中,並保存 xe.Add(book1); ///創建一個新節點 XElement book2 = new XElement("Book", new XAttribute("BookID", "003"), new XElement("BookNo", "0003"), new XElement("BookName", "Book 0003"), new XElement("BookPrice", "30"), new XElement("BookRemark", "This is a book 0003") ); ///添加節點到XML文件中,並保存 xe.Add(book2); ///創建一個新節點 XElement book3 = new XElement("Book", new XAttribute("BookID", "004"), new XElement("BookNo", "0004"), new XElement("BookName", "Book 0004"), new XElement("BookPrice", "60"), new XElement("BookRemark", "This is a book 0004") ); ///添加節點到XML文件中 xe.Add(book3); ///保存到XML文件中 xe.Save(@"C:\Books.xml");
3.修改元素
XElement xe = XElement.Load(@"C:\Books.xml"); ///查詢修改的元素 IEnumerable<XElement> element = from e in xe.Elements("Book") where e.Attribute("BookID").Value == "xxx" //xxx指定的修改元素 select e; ///修改元素 if (element.Count() > 0) { XElement firstelement = element.First(); ///設置新的屬性 firstelement.SetAttributeValue("BookID", "new004"); ///替換成新的節點 firstelement.ReplaceNodes( new XElement("BookNo", "new0004"), new XElement("BookName", "Book new0004"), new XElement("BookPrice", "45"), new XElement("BookRemark", "This is a book new0004") ); } xe.Save(@"C:\Books.xml");
4.刪除元素
XElement xe = XElement.Load(@"C:\Books.xml"); ///查詢修改的元素 IEnumerable<XElement> element = from e in xe.Elements("Book") where e.Attribute("BookID").Value == "xxx" //xxx 指定刪除元素 select e; ///修改元素 if (element.Count() > 0) { XElement firstelement = element.First(); ///刪除此元素的所有節點和屬性 firstelement.RemoveAll(); ///刪除此元素的屬性 //firstelement.RemoveAttributes(); ///刪除此元素的子節點 //firstelement.RemoveNodes(); } xe.Save(@"C:\Books.xml");
5.一些常用查詢
XElement xe = XElement.Load(@"C:\Books.xml"); //查詢元素並排序 var elements = xe.Elements("Book") .Where(e => Convert.ToInt32(e.Attribute("BookID").Value.Substring(e.Attribute("BookID").Value.Length - 1, 1)) > 1) .OrderByDescending(e => (string)e.Element("BookName")) .ToList(); //查詢指定元素的子元素 var elements = xe.Elements("Book") .Descendants("xxx") //xxx 指定元素 .ToList(); //查詢指定屬性的元素 var eAttribute = xe.Elements("Book") .Where(e => (string)e.Attribute("BookID") == "xxx") //xxx 指定屬性 .OrderBy(e => e.Element("BookID")) .ToList(); //查詢指定名稱的元素 var elements = xe.Elements("Book") .Where(e => (string)e.Element("BookName") == "xxx") //指定元素名稱 .OrderBy(e => e.Element("BookID")) .ToList();
到這裡結束了,現在感覺LINQ to XML 是不是很簡單啊,相信你會喜歡上Linq語法的。
本文只著重介紹了LINQ to XML 類的 XElement、XAttribute和XDocument三個類,當然還有其他的一些,這裡就不作詳細介紹了,如需查看請點此跳轉到MSDN LINQ to XML 類概述。
感謝您的閱讀,如有任何建議請評論提出,會改進的。
趕緊還不錯,請推薦下,謝謝。
string xml = "<Path><Background FileName=\"AAA\"></Background><Background FileName=\"BBB\"></Background><Background FileName=\"CCC\"></Background></Path>";
XElement el = XElement.Parse(xml);
XElement newEl = new XElement("image", "d:/1.jpg", new XAttribute("name", "1.jpg"));
el.Elements("Background").Where(e=>e.Attribute("FileName").Value=="AAA").First().Add(newEl);
Console.WriteLine(el);
這個應該是Linq to Xml吧,Linq to Sql是數據庫的
Dim XMLFilePath As String = Request.PhysicalApplicationPath & "/Rules.xml"
Dim XMLValues As XElement = XElement.Load(XMLFilePath)
Dim Values = (From x In XMLValues.Elements() _
Order BY x.Element("UserTime") _
Select New With { _
.UserName = CType(x.Element("UserName"), String), _
.UserTime = CType(x.Element("UserTime"), String)}).FirstOrDefault
取出最後1次寫入xml中的數據