XmlReaderとXML Writer(抽象クラス)

8043 ワード

一、概説
XML Readerは抽象クラスであり、その派生クラスはXmlDictionaryReader、XmlNodeReader、XmlTextReader(IOネーミングスペースのTextReaderオブジェクトとともに使用)、XmlValidatingReader(DTDとモード検証を追加し、データの有効性検証を提供する)である.
•XmlReader reader =new XmlTextReader(xmlFile);
•XmlReader reader =new XmlNodeReader(xmNode);

XML Writerは抽象クラスであり、その派生クラスはXmlTextWriterとXmlQueryWriterクラスである.
二、XML Reader
1、概要
XmlDocumentとXElementは、Xmlを読み込むときにXmlドキュメント全体をメモリに入れて操作します.これは簡単ですが、メモリがかかります.一部のシーンでは、メモリをできるだけ節約することを考慮しなければなりません.このとき、XmlReaderとXmlWriterが登場します.
XmlReaderはSAXによく似ています.これらの最大の違いは、SAXがプッシュモデルである(すべてのXMLデータはアプリケーションによって処理されなければならない.これらのデータが必要かどうかにかかわらず)、XmlReaderはプルモデルである(すべてのデータが必要でなければ処理する必要はない).
XmlReaderがXmlを読み込むには、Read()インスタンスメソッドを使用して、Xmlドキュメントの宣言、ノードの開始、ノードの内容、ノードの終了、および空白などを繰り返し読み取る必要があります.ドキュメントが終了するまで、Read()メソッドはfalseを返します.
2、使い方
(1)静的メソッドCreate()を使用して、XmlReaderオブジェクトを返します.
(2)Read()メソッドは次のノードに進むことができる.
XmlReaderクラスでは、ReadValueAsDouble、ReadValueAsBooleanなど、いくつかのReadValuesAsメソッドがある強力なタイプ化されたデータも読み取ることができます.
3、属性データの取得
AttributeCountプロパティは、プロパティの数を決定します.GetAttribute()メソッドは、名前またはインデックスに従ってプロパティを取得し、1つのプロパティを一度に反復する場合はMoveToFirstAttribute()メソッドとMoveToNextAttribute()メソッドを使用します.
XmlReader tr = XmlReader.Create("book.xml");  while (tr.Read()){  if (tr.NodeType == XmlNodeType.Element){    for (int i = 0; i < tr.AttributeCount; i++)
    {      richTextBox1.AppendText(tr.GetAttribute(i)+"\r");      }    } }
4、XmlReaderクラスを使用して検証する
ドキュメントのフォーマットが仕様であるか、ドキュメントが有効であるかを知る必要がある場合があります.
XmlReaderではXmlReader Settingsを使用してXSDモードに従ってXMLを検証できます.XSDモードはXMLSchemaSetに追加され、Schema属性でXMLSchemaSetにアクセスできます.XsdValidate属性は、flaseとしてデフォルト設定する必要があります.
5、例:
XmlReader Settings=new XmlReader Settings();settings.IgnoreComments=true;settings.IgnoreWhitespace=true;XmlReader=XmlReader.Create("Customer 2.xml",settings);//settingsパラメータはオプション.List lists=new List();CustomerInfo cust=null;
while(reader.Read()/次のノードを読み込む{    if (reader.NodeType == XmlNodeType.Element)     {         switch (reader.Name)         {             case "row":                 cust = new CustomerInfo();                 if(reader.HasAttributes)/属性がドキュメント構造の一部ではないため、専門的にチェックします.属性HasValueに値があるかどうか;IsEmptyElement:空の要素であるかどうか                {                     cust.AppId = reader.GetAttribute("AppID");                     cust.Version = reader.GetAttribute("Version");                 }                 break;
            case "CustomerID":                 cust.CustomerID = reader.ReadString();                 break;
            case "CompanyName":                 cust.CompanyName = reader.ReadString();                 break;             default:                 break;
        }     } }
6、バイトデータの読み出し
次の例では、インラインBinHex符号化画像を読み出します.BinHexデータは要素に埋め込まれます. BinaryWriter 新しいバイナリ・データ・ファイルを作成します.
public static void BinHexDecodeImageFile() {
  byte[] buffer = new byte[1000];   int readBytes = 0;
  using (XmlReader reader = XmlReader.Create("output.xml")) {                                 FileStream outputFile = new FileStream(@"C:\artFiles\dataewImage.jpg", FileMode.OpenOrCreate,                                                                        FileAccess.Write, FileShare.Write);        //Read to the image element.         reader.ReadToFollowing("image");        //Read the BinHex data.         Console.WriteLine("\rReading BinHex...");         BinaryWriter bw = new BinaryWriter(outputFile);         while ((readBytes = reader.ReadElementContentAsBinHex(buffer, 0, 50))>0) {             bw.Write(buffer, 0, readBytes);         }         outputFile.Close();            } }
三、XML Writer
XmlReaderと同様に、XmlWriterクラスは、前のみキャッシュされずに書き込まれます.
1.XmlWriterを使用してXmlドキュメント宣言を書く方法
WriteStartDocumentメソッドでは、standaloneが独立したドキュメントであるかどうかを示すboolパラメータを受け入れるか、パラメータstandaloneを指定せずにデフォルト値を維持できます.
xmlWriter.WriteStartDocument(false|true);

注意WriteStartDocumentメソッドを使用する場合は、xmlWrite.WriteEndDocument()メソッドを呼び出して、閉じていない可能性のあるすべてのラベルを閉じることが望ましい
2.XmlWriterを使用してxmlノードと属性を書く方法
//書き込みノードxmlWriter.WriteStartElement(「cat」);
//ノードに属性xmlWriter.WriteAttributeString(「color」>「white」)を追加する.
//ノード内部にテキストxmlWriter.WriteString("I'm a cat");xmlWriter.WriteEndElement(); 
あるいは、xmlWriter.WriteElementString(「pig」,「pig is great」)のように、xmlノードをWriteElementString(string,string)メソッドで書きながらノード値を書きます.
3.CDataの書き方
xmlWriter.WriteCData("dog is dog");

4.XmlWriterを使用してコメントを追加する方法
xmlWriter.WriteComment("*** ");

5.XmlWriterの出力フォーマットを設定し、出力UTF-16の問題を解決する方法
xml出力フォーマットを設定するには、XmlWriterSettingsクラスで次のコードを使用します.
XmlWriterSettings settings = new XmlWriterSettings();
//settings.Indent=trueをインデントする必要があります.
//注encodingデフォルトを設定しないとutf-16が出力されます //ここでEncoding.UTF 8は、出力テキストの先頭に4バイトの非xmlコンテンツsettings.Encoding=new UTF 8 Encoding(false)をEncoding.UTF 8で追加する場合には使用できません.
 //改行文字settings.NewLineChars=Environment.NewLineを設定します.
6、他のオブジェクトに書き込む
XmlWriterクラスは、Xmlをストリーム、ファイル、StringBuilder、TextWriter、または別のXmlWriterオブジェクトに書き込むことができます.
7、ネーミングスペースのサポート
XmlTextWriter w = new XmlTextWriter(Console.Out); w.WriteStartElement("x","root","urn:1"); w.WriteStartElement("y","item","urn:1"); w.WriteAttributeString("abc","urn:1","xyz"); w.WriteEndElement(); w.WriteEndElement(); w.Close();
8、完全なコードの例は以下の通りです.
XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = "\t"; settings.NewLineOnAttributes = false; settings.ConformanceLevel = ConformanceLevel.Auto; settings.OmitXmlDeclaration = false;    //注encodingデフォルトを設定しないとutf-16が出力されます   //ここではEncoding.UTF 8を直接使用することはできません.Encoding.UTF 8を使用すると、出力テキストの先頭に4バイトの非xmlコンテンツが追加されます.   settings.Encoding = new UTF8Encoding(false);    //改行の設定   settings.NewLineChars = Environment.NewLine;
XmlWriter=XmlWriter.Create(「CustomerNewElementArribute.xml」、settings);///settingsパラメータはオプションです.////////xmlwriterを使用してStringBuilerおよびStream:///StringBuilder builder=new StringBuilder()//////////////////////XmlWriter writer=XmlWriter.Create( builder、settings);///MemoryStream stream=new MemoryStream()//XmlWriter/XmlWriter writer=XmlWriter=XmlWriter.Creater=XmlWriter=XmlWriWriter writer=XmlWriter.Create(stream,settings);writer.WriteStartDocument();//Xml宣言を書く:オプションパラメータはstandalone、独立ドキュメントwriter.WriteComment("XXX");//writer.WriteStartElement("Table");//複雑な要素(要素にサブ要素が含まれている)for(int i=1;i<10;i+){    writer.WriteStartElement("row");     writer.WriteAttributeString("Version", "2.0");     writer.WriteAttributeString("AppID", "111");     writer.WriteElementString(「CustomerID」,「cmz」+i.ToString();//簡単な要素を書く    writer.WriteElementString("CompanyName","程沐喆"+i.ToString();    writer.WriteEndElement(); }
writer.WriteEndElement(); writer.WriteEndDocument(); writer.Flush(); writer.Close();
9、WriteBinHex方法でBinHexデータを作成する
//WriteBinHexメソッドでBinHexデータを記述します.BinHexデータは要素に埋め込まれています.int bufferSize=1000;byte[]buffer=new byte[bufferSize];int readBytes=0;
using (XmlWriter writer = XmlWriter.Create("output.xml")) {     FileStream inputFile = new FileStream(@"C:\sunset.jpg", FileMode.OpenOrCreate,                                                                     FileAccess.Read, FileShare.Read);     writer.WriteStartDocument();     writer.WriteStartElement("image");     BinaryReader br = new BinaryReader(inputFile);     Console.WriteLine("\rWriting BinHex data...");
    do     {         readBytes = br.Read(buffer, 0, bufferSize);         writer.WriteBinHex(buffer, 0, readBytes);     } while (bufferSize <= readBytes);     br.Close();
    writer.WriteEndElement();//     writer.WriteEndDocument(); }