zoukankan      html  css  js  c++  java
  • C# 3.0 其他XML技术

    使用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");
  • 相关阅读:
    vs code插件
    各大厂RTSP取流的URI
    关于VLC无法播放rtsp的问题分析
    VLC查看日志的方法
    wireshark的过滤命令
    vs编译完提示不支持尝试的执行操作
    vs2015的密钥
    VS制作dll、def文件的使用、dll加入工程使用
    python之NLP数据清洗
    python 生成词云
  • 原文地址:https://www.cnblogs.com/yangzhenping/p/3346034.html
Copyright © 2011-2022 走看看