2011-09-15 8 views
0

XmlReaderを使用して大規模なXML文書を走査しており、はるかに小さく、扱いやすいXmlDocmuentにステッチしています。途中、私は面白いノードを見つけるので、それを動かすために、私はこれを行う:私はその子孫ずにノードを含めたい除い子を持たずにノードをそのまま返すXmlReader

 targetDoc.LoadXml("<result></result>"); 
     // Some interesting code removed 
     using (XmlReader r = XmlReader.Create(file)) 
     { 
      while (r.Read()) 
      { 
       if (r.NodeType == XmlNodeType.Element) 
       { 
        if (r.Name == match) 
        { 
         // Put the node into the target document 
         targetDoc.FirstChild.InnerXml = r.ReadOuterXml(); 
         return targetDoc; 
        } 
       } 
      } 
     } 

これは、すべてが順調と良いです。私が興味を持っているのは、その属性を持つノード自体です。この時点で、子孫は非常に大きく、かさばり、面白くありません。

見つかった要素のテキスト(?)をその属性で取得する簡単な方法はありますか(その子孫ではありません)ターゲット文書に挿入しますか?

+1

あなたは使うべきではありません '新しいXmlTextReaderクラスを生成します()'。代わりに 'XmlReader.Create()'を使用してください。 –

+0

実際には、外部関数(図示せず)から引数として渡され、SOに対して型付けされました。うまくいけば、私は代わりに役に立つ答えを得るだろう。 –

+0

ここに表示されているコードをコピー/ペーストするよりもよく分からない人を助けようとしています。 –

答えて

1

私はそれを行う組み込みの方法はないと思います。私はあなた自身の属性と内容を読まなければならないと思います。

static void Main(string[] args) 
     { 
      var xml = @"<root> 
           <parent a1 = 'foo' a2 = 'bar'>Some Parent text 
            <child a3 = 'frob' a2= 'brob'> Some Child Text 
            </child> 
           </parent> 
      </root>"; 
      var file = new StringReader(xml) ; 

      using (XmlReader r = XmlReader.Create(file)) 
      { 
       while (r.Read()) 
       { 
        if (r.NodeType == XmlNodeType.Element) 
        { 
         if (r.Name == "parent") 
         { 
          var output = new StringBuilder(); 
          var settings = new XmlWriterSettings(); 
          settings.OmitXmlDeclaration = true; 
          using (var elementWriter = XmlWriter.Create(output, settings)) 
          { 

           elementWriter.WriteStartElement(r.Name); 

           elementWriter.WriteAttributes(r,false); 
           elementWriter.WriteValue(r.ReadString()); 
           elementWriter.WriteEndElement(); 
          } 

          Console.WriteLine(output.ToString()); 
         } 
        } 
       } 
      } 


      if (System.Diagnostics.Debugger.IsAttached) 
       Console.ReadLine(); 

     } 

<parent a1="foo" a2="bar">Some Parent text</parent> 
Press any key to continue . . . 
+0

これはよさそうだ。 –

0

XmlNode.CloneNode(bool deep)メソッドを試すことができます。

deep:指定されたノードの下にあるサブツリーを再帰的に複製する場合はtrue。ノード自体をクローンするにはfalseを返します。

+0

子孫が大きすぎるため、クローンを作成するXmlNodeはありません。 –

0

必ずしも良い方法ではありませんが、開始タグの最後に到達するまで文字列を読み取ってから、手動で終了タグを追加し、XmlDocumentに読み込みます。

編集:

のようなものを考える:

string xml = r.ReadOuterXml(); 
int firstEndTag = xml.IndexOf('>'); 
int lastStartTag = xml.LastIndexOf('<'); 
string newXml = xml.Substring(0, firstEndTag) + xml.Substring(lastStartTag); 

をこれは、大規模な文字列はすぐそこにありますことを考えると、全く有効ではない可能性があります。あなたの道は最高かもしれません。どちらも可愛いわけではありませんが、あなたの制約(より良い方法が存在しないとは限りません)を考えれば、私は個人的にはより良い方法を考えることができません。

+0

私は次のようなものを考えました: 'if(r.HasAttributes) for(int i = 0; i } 'あなたが示唆するようにノードのXMLを再構築しますが、それは...醜いようです。 –

+0

@clintpが編集されました。 –

関連する問題