使用XmlReader枚举结点:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <customer id="123" status="archived"> <firstname>Jim</firstname> <lastname>Bo</lastname> </customer>
XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; using (XmlReader reader = XmlReader.Create ("customer.xml", settings)) while (reader.Read()) { Console.Write (new string (' ',reader.Depth*2)); // Write indentation Console.WriteLine (reader.NodeType); }
处理XNodeType:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE customer [ <!ENTITY tc "Top Customer"> ]> <customer id="123" status="archived"> <firstname>Jim</firstname> <lastname>Bo</lastname> <quote><![CDATA[C#'s operators include: < > &]]></quote> <notes>Jim Bo is a &tc;</notes> <!-- That wasn't so bad! --> </customer>
XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; settings.ProhibitDtd = false; // Must set this to read DTDs using (XmlReader r = XmlReader.Create ("customer.xml", settings)) while (r.Read()) { Console.Write (r.NodeType.ToString().PadRight (17, '-')); Console.Write ("> ".PadRight (r.Depth * 3)); switch (r.NodeType) { case XmlNodeType.Element: case XmlNodeType.EndElement: Console.WriteLine (r.Name); break; case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.Comment: case XmlNodeType.XmlDeclaration: Console.WriteLine (r.Value); break; case XmlNodeType.DocumentType: Console.WriteLine (r.Name + " - " + r.Value); break; default: break; } }
使用ReadElementContentAs:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <customer id="123" status="archived"> <firstname>Jim</firstname> <lastname>Bo</lastname> <creditlimit>500.00</creditlimit> <!-- OK, we sneaked this in! --> </customer>
XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; using (XmlReader r = XmlReader.Create ("customer.xml", settings)) { r.MoveToContent(); // Skip over the XML declaration r.ReadStartElement ("customer"); string firstName = r.ReadElementContentAsString ("firstname", ""); string lastName = r.ReadElementContentAsString ("lastname", ""); decimal creditLimit = r.ReadElementContentAsDecimal ("creditlimit", ""); r.MoveToContent(); // Skip over that pesky comment r.ReadEndElement(); // Read the closing customer tag }
可选元素:
r.ReadStartElement ("customer"); string firstName = r. ReadElementContentAsString ("firstname", ""); string lastName = r.Name == "lastname" ? r.ReadElementContentAsString() : null; decimal creditLimit = r.ReadElementContentAsDecimal ("creditlimit", "");
Checking for an empty element:
bool isEmpty = reader.IsEmptyElement; reader.ReadStartElement ("customerList"); if (!isEmpty) reader.ReadEndElement();
读取特性attributes:
<customer id="123" status="archived"/>
Console.WriteLine (reader ["id"]); // 123 Console.WriteLine (reader ["status"]); // archived Console.WriteLine (reader ["bogus"] == null); // True Console.WriteLine (reader [0]); // 123 Console.WriteLine (reader [1]); // archived reader.MoveToAttribute ("status"); string status = ReadContentAsString(); reader.MoveToAttribute ("id"); int id = ReadContentAsInt();
if (reader.MoveToFirstAttribute()) do { Console.WriteLine (reader.Name + "=" + reader.Value); } while (reader.MoveToNextAttribute()); // OUTPUT: id=123 status=archived
XmlWriter:
XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; using (XmlWriter writer = XmlWriter.Create ("..\\..\\foo.xml", settings)) { writer.WriteStartElement ("customer"); writer.WriteElementString ("firstname", "Jim"); writer.WriteElementString ("lastname"," Bo"); writer.WriteEndElement(); }
写特性attributes:
writer.WriteStartElement ("customer"); writer.WriteAttributeString ("id", "1"); writer.WriteAttributeString ("status", "archived");
Namespaces and prefixes:
writer.WriteStartElement ("o", "customer", "http://oreilly.com"); writer.WriteElementString ("o", "firstname", "http://oreilly.com", "Jim"); writer.WriteElementString ("o", "firstname", "http://oreilly.com", "Bo"); writer.WriteEndElement();
使用分层数据:
public class Customer { public const string XmlName = "customer"; public int? ID; public string FirstName, LastName; public Customer() { } public Customer (XmlReader r) { ReadXml (r); } public void ReadXml (XmlReader r) { if (r.MoveToAttribute ("id")) ID = r.ReadContentAsInt(); r.ReadStartElement(); FirstName = r.ReadElementContentAsString ("firstname", ""); LastName = r.ReadElementContentAsString ("lastname", ""); r.ReadEndElement(); } public void WriteXml (XmlWriter w) { if (ID.HasValue) w.WriteAttributeString ("id", "", ID.ToString()); w.WriteElementString ("firstname", FirstName); w.WriteElementString ("lastname", LastName); } } public class Supplier { public const string XmlName = "supplier"; public string Name; public Supplier() { } public Supplier (XmlReader r) { ReadXml (r); } public void ReadXml (XmlReader r) { r.ReadStartElement(); Name = r.ReadElementContentAsString ("name", ""); r.ReadEndElement(); } public void WriteXml (XmlWriter w) { w.WriteElementString ("name", Name); } } public class Contacts { public IList<Customer> Customers = new List<Customer>(); public IList<Supplier> Suppliers = new List<Supplier>(); public void ReadXml (XmlReader r) { bool isEmpty = r.IsEmptyElement; // This ensures we don't get r.ReadStartElement(); // snookered by an empty if (isEmpty) return; // <contacts/> element! while (r.NodeType == XmlNodeType.Element) { if (r.Name == Customer.XmlName) Customers.Add (new Customer (r)); else if (r.Name == Supplier.XmlName) Suppliers.Add (new Supplier (r)); else throw new XmlException ("Unexpected node: " + r.Name); } r.ReadEndElement(); } public void WriteXml (XmlWriter w) { foreach (Customer c in Customers) { w.WriteStartElement (Customer.XmlName); c.WriteXml (w); w.WriteEndElement(); } foreach (Supplier s in Suppliers) { w.WriteStartElement (Supplier.XmlName); s.WriteXml (w); w.WriteEndElement(); } } }
使用XmlReader和XElement:
XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; using (XmlReader r = XmlReader.Create ("logfile.xml", settings)) { r.ReadStartElement ("log"); while (r.Name == "logentry") { XElement logEntry = (XElement) XNode.ReadFrom (r); int id = (int) logEntry.Attribute ("id"); DateTime date = (DateTime) logEntry.Element ("date"); string source = (string) logEntry.Element ("source"); ... } r.ReadEndElement(); }
使用XmlWriter和XElement:
using (XmlWriter w = XmlWriter.Create ("log.xml")) { w.WriteStartElement ("log"); for (int i = 0; i < 1000000; i++) { XElement e = new XElement ("logentry", new XAttribute ("id", i), new XElement ("date", DateTime.Today.AddDays (-1)), new XElement ("source", "test")); e.WriteTo (w); } w.WriteEndElement(); }
创建一个XmlDocument:
XmlDocument doc = new XmlDocument(); doc.AppendChild (doc.CreateXmlDeclaration ("1.0", null, "yes")); XmlAttribute id = doc.CreateAttribute ("id"); XmlAttribute status = doc.CreateAttribute ("status"); id.Value = "123"; status.Value = "archived"; XmlElement firstname = doc.CreateElement ("firstname"); XmlElement lastname = doc.CreateElement ("lastname"); firstname.AppendChild (doc.CreateTextNode ("Jim")); lastname.AppendChild (doc.CreateTextNode ("Bo")); XmlElement customer = doc.CreateElement ("customer"); customer.Attributes.Append (id); customer.Attributes.Append (status); customer.AppendChild (lastname); customer.AppendChild (firstname); doc.AppendChild (customer);
XPath:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <customers> <customer id="123" status="archived"> <firstname>Jim</firstname> <lastname>Bo</lastname> </customer> <customer> <firstname>Thomas</firstname> <lastname>Jefferson</lastname> </customer> </customers>
XmlDocument doc = new XmlDocument(); doc.Load ("customers.xml"); XmlNode n = doc.SelectSingleNode ("customers/customer[firstname='Jim']"); Console.WriteLine (n.InnerText); // JimBo
XDocument doc = XDocument.Load (@"Customers.xml"); XElement e = e.XPathSelectElement ("customers/customer[firstname='Jim']"); Console.WriteLine (e.Value); // JimBo
XmlNode node1 = doc.SelectSingleNode ("customers"); XmlNode node2 = doc.SelectSingleNode ("customers/customer"); XmlNodeList nodes3 = doc.SelectNodes ("//lastname"); XmlNodeList nodes4 = doc.SelectNodes ("customers/customer..customers"); XmlNodeList nodes5 = doc.SelectNodes ("customers/customer/*"); XmlNode node6 = doc.SelectSingleNode ("customers/customer/@id"); XmlNode node7 = doc.SelectSingleNode ("customers/customer[firstname='Jim']"); XmlNode node8 = doc.SelectSingleNode ("x:customers");
XPathNavigator:
XPathNavigator nav = doc.CreateNavigator(); XPathNavigator jim = nav.SelectSingleNode ( "customers/customer[firstname='Jim']" ); Console.WriteLine (jim.Value); // JimBo
使用Select:
XPathNavigator nav = doc.CreateNavigator(); string xPath = "customers/customer/firstname/text()"; foreach (XPathNavigator navC in nav.Select (xPath)) Console.WriteLine (navC.Value);
Compiling an XPath query:
XPathNavigator nav = doc.CreateNavigator(); XPathExpression expr = nav.Compile ("customers/customer/firstname"); foreach (XPathNavigator a in nav.Select (expr)) Console.WriteLine (a.Value);
命名空间查询:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <o:customers xmlns:o='http://oreilly.com'> <o:customer id="123" status="archived"> <firstname>Jim</firstname> <lastname>Bo</lastname> </o:customer> <o:customer> <firstname>Thomas</firstname> <lastname>Jefferson</lastname> </o:customer> </o:customers>
XmlDocument doc = new XmlDocument(); doc.Load ("customers.xml"); XmlNamespaceManager xnm = new XmlNamespaceManager (doc.NameTable); xnm.AddNamespace ("o", "http://oreilly.com"); XmlNode n = doc.SelectSingleNode ("o:customers/o:customer", xnm);
XPathDocument:
XPathDocument doc = new XPathDocument ("customers.xml"); XPathNavigator nav = doc.CreateNavigator(); foreach (XPathNavigator a in nav.Select ("customers/customer/firstname")) Console.WriteLine (a.Value);
XSD和schema验证:
<?xml version="1.0"?> <customers> <customer id="1" status="active"> <firstname>Jim</firstname> <lastname>Bo</lastname> </customer> <customer id="1" status="archived"> <firstname>Thomas</firstname> <lastname>Jefferson</lastname> </customer> </customers>
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="customers"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="customer"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string" /> <xs:element name="lastname" type="xs:string" /> </xs:sequence> <xs:attribute name="id" type="xs:int" use="required" /> <xs:attribute name="status" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
验证一个XmlReader:
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas.Add (null, "customers.xsd"); using (XmlReader r = XmlReader.Create ("customers.xml", settings)) try { while (r.Read()) ; } catch (XmlSchemaValidationException ex) { ... }
使用ValidationEventHandler:
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas.Add (null, "customers.xsd"); settings.ValidationEventHandler += ValidationHandler; using (XmlReader r = XmlReader.Create ("customers.xml", settings)) while (r.Read()) ;
static void ValidationHandler (object sender, ValidationEventArgs e) { Console.WriteLine ("Error: " + e.Exception.Message); }
验证一个X-DOM或者XmlDocument:
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas.Add (null, "customers.xsd"); XDocument doc; using (XmlReader r = XmlReader.Create ("customers.xml", settings)) try { doc = XDocument.Load (r); } catch (XmlSchemaValidationException ex) { ... } XmlDocument xmlDoc = new XmlDocument(); using (XmlReader r = XmlReader.Create ("customers.xml", settings)) try { xmlDoc.Load (r); } catch (XmlSchemaValidationException ex) { ... }
XDocument doc = XDocument.Load (@"customers.xml"); XmlSchemaSet set = new XmlSchemaSet(); set.Add (null, @"customers.xsd"); StringBuilder errors = new StringBuilder(); doc.Validate (set, (sender, args) => { errors.AppendLine (args.Exception.Message); } ); Console.WriteLine (errors.ToString());
XSLT:
<customer> <firstname>Jim</firstname> <lastname>Bo</lastname> </customer>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <p><xsl:value-of select="//firstname"/></p> <p><xsl:value-of select="//lastname"/></p> </html> </xsl:template> </xsl:stylesheet>
XslCompiledTransform transform = new XslCompiledTransform(); transform.Load ("test.xslt"); transform.Transform ("input.xml", "output.xml");