2011-01-06 15 views
1

XMLファイルの特定のノードを編集する必要があります。.NET XmlTextReaderで特定のXMLノードを見つけた後に編集する

私はそれらをXmlTextReaderで収集しました。 Remarkノードを見つけたら、次のノードにスキップします。私が他の指定されたノードに遭遇し、それらが特定のパターンで始まらない場合、それらをコレクションに入れます。

List<KeyValuePair<string, string>> Data = new List<KeyValuePair<string, string>>(); 
string key = ""; 
string value = ""; 
reader = new XmlTextReader(file); 

switch (reader.NodeType) 
{ 
    case XmlNodeType.Element: 
     switch (reader.Name) 
     { 
      case "Remark": 
       reader.Skip(); 
       break; 
      case "DataTableColumn": 
      case "Label": 
      case "Button": 
      case "PopupPanel": 
       while (reader.MoveToNextAttribute()) 
       { 
        switch (reader.Name) 
        { 
         case "ID": 
          key = reader.Value; 
          break; 
         case "Header": 
         case "Caption": 
          value = reader.Value; 
          break; 
        } 
       } 
       if (!value.StartsWith("@")) 
       { 
        Data.Add(new KeyValuePair<string, string>(key, value)); 
       } 
       break; 
     } 
     break; 
} 

この時点で、コレクションのすべてのアイテムの値が変更されています。元のファイルを更新します。これを行う最善の方法は何ですか?

+0

お使いの.NETのバージョンは? –

+0

4.0(これはフィラーテキストです) – Stijn

答えて

1

まず、new XmlTextReader()を使用しないでください。 .NET 2.0以降、非推奨になりました。代わりにXmlReader.Create()を使用してください。

もう1つは、XmlReaderは読み取り専用の転送専用カーソルです。変更されたノードを書き戻すことはできません。

この種の作業を行うには、LINQ to XMLまたはXmlDocumentを使用する必要があります。

+0

XmlDocumentを試してみます。私はXmlReaderと同じ選択をすることはできないだろうと思っていましたが、MSDNをもう一度見てから、可能だと思います。 – Stijn

+0

.NET 4.0を使用しているので、LINQ to XMLを使用する必要があります。それはかなりエレガントです。 –

2

XSLTを使用しない理由はありますか?それはこれを行うための最も適切な技術であるように思えます。

+0

XSLTが正しく理解されない限り、それは私を助けません。元のファイルの値を見つけて置き換える必要があります。ファイルにはローカライズする必要がある文字列があるので、それらの文字列を割り当てられた定数で置き換えたいと思います。たとえば、

+1

これはXSLTではかなり簡単です。以下で述べるように、XSLTを使用したくない場合は、XMLReaderよりもXmlDocumentを使用するほうが効率的です(XMLReaderは前方のみであり、読み取り専用です)。 –

2

XMLファイルを変更する必要がある場合は、XDocumentを使用することをお勧めします。
それ以外の場合は、XmlReaderを使用して、XmlWriterと組み合わせて読み込みを行うか、XSLTを使用してください。

関連する問題