Csharp/C Sharp/XML/XPath
Содержание
Find Elements with an XPath Search
<source lang="csharp"> using System; using System.Xml; public class XPathSelectNodes {
private static void Main() { // Load the document. XmlDocument doc = new XmlDocument(); doc.Load("books.xml"); XmlNodeList nodes = doc.SelectNodes("/books/A/B"); foreach (XmlNode node in nodes) { Console.WriteLine(node.InnerText); } }
} /* <books>
<A property="a"> text <C>textg</C> <D>99999</D> </A>
</books>
- /
</source>
Read XML node using the XML path
<source lang="csharp"> using System; using System.Xml; public class SellItems {
static void Main(string [] args) { XmlDocument inventory = new XmlDocument(); inventory.Load("inventory.xml"); XmlNodeList elements = inventory.SelectNodes("//inventory/items/item"); foreach (XmlElement element in elements) { string productCode = element.GetAttribute("productCode"); int quantitySold = Int32.Parse(element.GetAttribute("quantity")); Console.WriteLine(quantitySold); string xPathExpression = "//items/item[@productCode="" + productCode + ""]"; XmlElement inventoryItem = (XmlElement)inventory.SelectSingleNode(xPathExpression); int quantity = Int32.Parse(inventoryItem.GetAttribute("quantity")); quantity -= quantitySold; inventoryItem.SetAttribute("quantity",quantity.ToString()); } inventory.Save("inventory.xml"); }
} /* <inventory>
<date year="2006" month="8" day="27" /> <items> <item quantity="5" productCode="01" description="PHP" unitCost="9.95" /> <item quantity="3" productCode="02" description="Perl" unitCost="4.95" /> </items>
</inventory>
- /
</source>
Select by path
<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath; public class MainClass {
public static void Main() { XmlDocument doc = new XmlDocument(); doc.Load("books.xml"); XPathNavigator nav = doc.CreateNavigator(); if (nav.CanEdit) { XPathNodeIterator iter = nav.Select("/bookstore/book/price"); while (iter.MoveNext()) { iter.Current.InsertAfter("<disc>5</disc>"); } } doc.Save("newbooks.xml"); }
}
</source>
XmlQuery Example
<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Windows.Forms; using System.Xml; class Form1 : Form {
private XmlDocument mDocument; private XmlNode mCurrentNode; public Form1() { InitializeComponent(); mDocument = new XmlDocument(); mDocument.Load("XPathQuery.xml"); mCurrentNode = mDocument.DocumentElement; ClearListBox(); } private void DisplayList(XmlNodeList nodeList) { foreach (XmlNode node in nodeList) { RecurseXmlDocumentNoSiblings(node, 0); } } private void RecurseXmlDocumentNoSiblings(XmlNode root, int indent) { if (root == null) return; if (root is XmlElement) { listBoxResult.Items.Add(root.Name.PadLeft(root.Name.Length + indent)); if (root.HasChildNodes) RecurseXmlDocument(root.FirstChild, indent + 2); } else if (root is XmlText) { string text = ((XmlText)root).Value; listBoxResult.Items.Add(text.PadLeft(text.Length + indent)); } else if (root is XmlComment) { string text = root.Value; listBoxResult.Items.Add(text.PadLeft(text.Length + indent)); if (root.HasChildNodes) RecurseXmlDocument(root.FirstChild, indent + 2); } } private void RecurseXmlDocument(XmlNode root, int indent) { if (root == null) return; if (root is XmlElement) { listBoxResult.Items.Add(root.Name.PadLeft(root.Name.Length + indent)); if (root.HasChildNodes) RecurseXmlDocument(root.FirstChild, indent + 2); if (root.NextSibling != null) RecurseXmlDocument(root.NextSibling, indent); } else if (root is XmlText) { string text = ((XmlText)root).Value; listBoxResult.Items.Add(text.PadLeft(text.Length + indent)); } else if (root is XmlComment) { string text = root.Value; listBoxResult.Items.Add(text.PadLeft(text.Length + indent)); if (root.HasChildNodes) RecurseXmlDocument(root.FirstChild, indent + 2); if (root.NextSibling != null) RecurseXmlDocument(root.NextSibling, indent); } } private void ClearListBox() { listBoxResult.Items.Clear(); } private void radioButtonSelectRoot_CheckedChanged(object sender, EventArgs e) { mCurrentNode = mCurrentNode.SelectSingleNode("//books"); ClearListBox(); RecurseXmlDocument(mCurrentNode, 0); } private void buttonClose_Click(object sender, EventArgs e) { Application.Exit(); } private void buttonExecute_Click(object sender, EventArgs e) { if (textBoxQuery.Text == "") return; try { XmlNodeList nodeList = mCurrentNode.SelectNodes(textBoxQuery.Text); ClearListBox(); DisplayList(nodeList); } catch (System.Exception err) { MessageBox.Show(err.Message); } } private void radioButtonSelectAllAuthors_CheckedChanged(object sender, EventArgs e) { XmlNodeList nodeList = mCurrentNode.SelectNodes("//book/author"); ClearListBox(); DisplayList(nodeList); } private void radioButtonSelectSpecificAuthor_CheckedChanged(object sender, EventArgs e) { XmlNodeList nodeList = mCurrentNode.SelectNodes("//book[author="J"]"); ClearListBox(); DisplayList(nodeList); } private void radioButtonSelectAllBooks_CheckedChanged(object sender, EventArgs e) { XmlNodeList nodeList = mCurrentNode.SelectNodes("//book"); ClearListBox(); DisplayList(nodeList); } private void radioButtonSetBookAsCurrent_CheckedChanged(object sender, EventArgs e) { mCurrentNode = mCurrentNode.SelectSingleNode("book[title="C#"]"); ClearListBox(); RecurseXmlDocumentNoSiblings(mCurrentNode, 0); } private void radioButtonSetBooksAsCurrent_CheckedChanged(object sender, EventArgs e) { mCurrentNode = mCurrentNode.SelectSingleNode("//books"); ClearListBox(); RecurseXmlDocumentNoSiblings(mCurrentNode, 0); } private void radioButtonSelectAllChildren_CheckedChanged(object sender, EventArgs e) { XmlNodeList nodeList = mCurrentNode.SelectNodes("*"); ClearListBox(); DisplayList(nodeList); } private void InitializeComponent() { this.radioButtonSelectRoot = new System.Windows.Forms.RadioButton(); this.radioButtonSelectAllChildren = new System.Windows.Forms.RadioButton(); this.radioButtonSetBooksAsCurrent = new System.Windows.Forms.RadioButton(); this.radioButtonSetBookAsCurrent = new System.Windows.Forms.RadioButton(); this.radioButtonSelectAllBooks = new System.Windows.Forms.RadioButton(); this.radioButtonSelectSpecificAuthor = new System.Windows.Forms.RadioButton(); this.radioButtonSelectAllAuthors = new System.Windows.Forms.RadioButton(); this.textBoxQuery = new System.Windows.Forms.TextBox(); this.buttonExecute = new System.Windows.Forms.Button(); this.buttonClose = new System.Windows.Forms.Button(); this.listBoxResult = new System.Windows.Forms.ListBox(); this.SuspendLayout(); this.radioButtonSelectRoot.AutoSize = true; this.radioButtonSelectRoot.Location = new System.Drawing.Point(13, 234); this.radioButtonSelectRoot.Size = new System.Drawing.Size(72, 17); this.radioButtonSelectRoot.Text = "Select root"; this.radioButtonSelectRoot.CheckedChanged += new System.EventHandler(this.radioButtonSelectRoot_CheckedChanged); this.radioButtonSelectAllChildren.AutoSize = true; this.radioButtonSelectAllChildren.Location = new System.Drawing.Point(163, 282); this.radioButtonSelectAllChildren.Size = new System.Drawing.Size(104, 17); this.radioButtonSelectAllChildren.Text = "Select all children"; this.radioButtonSelectAllChildren.CheckedChanged += new System.EventHandler(this.radioButtonSelectAllChildren_CheckedChanged); this.radioButtonSetBooksAsCurrent.AutoSize = true; this.radioButtonSetBooksAsCurrent.Location = new System.Drawing.Point(163, 258); this.radioButtonSetBooksAsCurrent.Size = new System.Drawing.Size(120, 17); this.radioButtonSetBooksAsCurrent.Text = "Set Books as current"; this.radioButtonSetBooksAsCurrent.CheckedChanged += new System.EventHandler(this.radioButtonSetBooksAsCurrent_CheckedChanged); this.radioButtonSetBookAsCurrent.AutoSize = true; this.radioButtonSetBookAsCurrent.Location = new System.Drawing.Point(163, 234); this.radioButtonSetBookAsCurrent.Size = new System.Drawing.Size(115, 17); this.radioButtonSetBookAsCurrent.Text = "Set Book as current"; this.radioButtonSetBookAsCurrent.CheckedChanged += new System.EventHandler(this.radioButtonSetBookAsCurrent_CheckedChanged); this.radioButtonSelectAllBooks.AutoSize = true; this.radioButtonSelectAllBooks.Location = new System.Drawing.Point(13, 306); this.radioButtonSelectAllBooks.Size = new System.Drawing.Size(96, 17); this.radioButtonSelectAllBooks.Text = "Select all books"; this.radioButtonSelectAllBooks.CheckedChanged += new System.EventHandler(this.radioButtonSelectAllBooks_CheckedChanged); this.radioButtonSelectSpecificAuthor.AutoSize = true; this.radioButtonSelectSpecificAuthor.Location = new System.Drawing.Point(13, 282); this.radioButtonSelectSpecificAuthor.Size = new System.Drawing.Size(137, 17); this.radioButtonSelectSpecificAuthor.Text = "Select by specific author"; this.radioButtonSelectSpecificAuthor.CheckedChanged += new System.EventHandler(this.radioButtonSelectSpecificAuthor_CheckedChanged); this.radioButtonSelectAllAuthors.AutoSize = true; this.radioButtonSelectAllAuthors.Location = new System.Drawing.Point(13, 258); this.radioButtonSelectAllAuthors.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3); this.radioButtonSelectAllAuthors.Size = new System.Drawing.Size(102, 17); this.radioButtonSelectAllAuthors.Text = "Select all authors"; this.radioButtonSelectAllAuthors.CheckedChanged += new System.EventHandler(this.radioButtonSelectAllAuthors_CheckedChanged); this.textBoxQuery.Location = new System.Drawing.Point(13, 330); this.textBoxQuery.Size = new System.Drawing.Size(385, 20); this.buttonExecute.Location = new System.Drawing.Point(323, 234); this.buttonExecute.Text = "Execute"; this.buttonExecute.Click += new System.EventHandler(this.buttonExecute_Click); this.buttonClose.Location = new System.Drawing.Point(405, 13); this.buttonClose.Text = "Close"; this.buttonClose.Click += new System.EventHandler(this.buttonClose_Click); this.listBoxResult.FormattingEnabled = true; this.listBoxResult.Location = new System.Drawing.Point(13, 13); this.listBoxResult.Size = new System.Drawing.Size(385, 212); this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(492, 362); this.Controls.Add(this.listBoxResult); this.Controls.Add(this.buttonClose); this.Controls.Add(this.buttonExecute); this.Controls.Add(this.textBoxQuery); this.Controls.Add(this.radioButtonSelectAllAuthors); this.Controls.Add(this.radioButtonSelectSpecificAuthor); this.Controls.Add(this.radioButtonSelectAllBooks); this.Controls.Add(this.radioButtonSetBookAsCurrent); this.Controls.Add(this.radioButtonSetBooksAsCurrent); this.Controls.Add(this.radioButtonSelectAllChildren); this.Controls.Add(this.radioButtonSelectRoot); this.Text = "XPath Queries"; this.ResumeLayout(false); this.PerformLayout(); }
private System.Windows.Forms.RadioButton radioButtonSelectRoot; private System.Windows.Forms.RadioButton radioButtonSelectAllChildren; private System.Windows.Forms.RadioButton radioButtonSetBooksAsCurrent; private System.Windows.Forms.RadioButton radioButtonSetBookAsCurrent; private System.Windows.Forms.RadioButton radioButtonSelectAllBooks; private System.Windows.Forms.RadioButton radioButtonSelectSpecificAuthor; private System.Windows.Forms.RadioButton radioButtonSelectAllAuthors; private System.Windows.Forms.TextBox textBoxQuery; private System.Windows.Forms.Button buttonExecute; private System.Windows.Forms.Button buttonClose; private System.Windows.Forms.ListBox listBoxResult; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); }
}
</source>
XPath Expression Syntax
<source lang="csharp"> Expression Description / Starts an absolute path that selects from the root node.
/Order/Items/Item selects all Item elements that are children of an Items element, which is itself a child of the root Order element.
// Starts a relative path that selects nodes anywhere.
//Item/Name selects all the Name elements that are children of an Item element, regardless of where they appear in the document.
@ Selects an attribute of a node.
/Order/@id selects the attribute named id from the root Order element.
- Selects any element in the path.
/Order/* selects both Items and Client nodes because both are contained by a root Order element.
| Combines multiple paths.
/Order/Items/Item/Name|Order/Client/Name selects the Name nodes used to describe a Client and the Name nodes used to describe an Item.
. Indicates the current (default) node.
If the current node is an Order, the expression ./Items refers to the related items for that order.
.. Indicates the parent node.
//Name/.. selects any element that is parent to a Name, which includes the Client and Item elements.
[ ] Define selection criteria that can test a contained node or attribute value.
/Order[@id="1999-01-30.195496"] selects the Order elements with the indicated attribute value. /Order/Items/Item[Price > 50] selects products above $50 in price. /Order/Items/Item[Price > 50 and Name="Laser Printer"] selects products that match two criteria.
starts-with This function retrieves elements based on what text a contained element starts with.
/Order/Items/Item[starts-with(Name, "C")] finds all Item elements that have a Name element that starts with the letter C.
position This function retrieves elements based on position.
/Order/Items/Item[position ()=2] selects the second Item element.
count This function counts elements. You specify the name of the child element to count or
an asterisk (*) for all children. /Order/Items/Item[count(Price) = 1] retrieves Item elements that have exactly one nested Price element. </source>
<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath; public class MainClass {
public static void Main() { XPathDocument doc = new XPathDocument("books.xml"); XPathNavigator nav = ((IXPathNavigable)doc).CreateNavigator(); XPathNodeIterator iter = nav.Select("/bookstore/book[@genre="novel"]"); while (iter.MoveNext()) { XPathNodeIterator newIter = iter.Current.SelectDescendants(XPathNodeType.Element, false); while (newIter.MoveNext()) Console.WriteLine(newIter.Current.Name + ": " + newIter.Current.Value); } }
}
</source>
XPathNodeIterator
<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath; public class MainClass {
public static void Main() { XPathDocument doc = new XPathDocument("books.xml"); XPathNavigator nav = ((IXPathNavigable)doc).CreateNavigator(); XPathNodeIterator iter = nav.Select("/bookstore/book"); while (iter.MoveNext()) { XPathNodeIterator newIter = iter.Current.SelectDescendants(XPathNodeType.Element, false); while (newIter.MoveNext()) Console.WriteLine(newIter.Current.Name + ": " + newIter.Current.Value); } Console.WriteLine("Total Cost = " + nav.Evaluate("sum(/bookstore/book/price)")); }
}
</source>
XPath Query Demo
<source lang="csharp"> using System; using System.Xml; using System.Xml.XPath; public class XPathQuery {
public static void Main(string [] args) { string filename = "inventory.xml"; string xpathExpression = "//inventory/items"; XmlDocument document = new XmlDocument( ); document.Load(filename); XmlTextWriter writer = new XmlTextWriter(Console.Out); writer.Formatting = Formatting.Indented; XmlNode node = document.SelectSingleNode(xpathExpression); node.WriteTo(writer); writer.Close( ); }
} /* <inventory>
<date year="2006" month="8" day="27" /> <items> <item quantity="5" productCode="01" description="PHP" unitCost="9.95" /> <item quantity="3" productCode="02" description="Perl" unitCost="4.95" /> </items>
</inventory>
- /
</source>