2016-07-21 1 views
1

XmlWriterを使用してXmlファイルを作成しました。あなたが "でWriteXml()" という名前のメソッドを呼び出すelement4、見ることができるようにXmlReaderを使用すると、空の要素をどのように読み取ることができますか?

public void WriteXml(XmlWriter writer) 
     { 
      writer.WriteStartElement("element1"); 
      writer.WriteAttributeString("attrs1", Attrs1); 
      writer.WriteAttributeString("attrs2", Attrs2); 

      if (!string.IsNullOrWhiteSpace("element2")) 
      { 
       writer.WriteStartElement("element2"); 
       writer.WriteCData(Element2); 
       writer.WriteEndElement(); 
      } 
      if (!string.IsNullOrWhiteSpace("element3")) 
      { 
       writer.WriteStartElement("element3"); 
       writer.WriteCData(Element3); 
       writer.WriteEndElement(); 
      } 
      Element4.WriteXml(writer); 
      Element5.WriteXml(writer); 

      writer.WriteEndElement();    
     } 

:ここ コードです。その方法は次のとおりです。

public void WriteXml(XmlWriter writer) 
     { 
      if (m_PropertyValueList.Count > 0) 
      { 
       writer.WriteStartElement("element4"); 

       foreach (var p in m_PropertyValueList) 
       { 
        if (p.CurrentValue != null) 
        { 
         writer.WriteStartElement("property"); 
         writer.WriteAttributeString("name", p.PropertyName); 
         writer.WriteAttributeString("value", p.CurrentValue.ToString()); 
         writer.WriteEndElement(); 
        } 
       }  
       writer.WriteEndElement(); 
      } 
     } 

p.CurrentValue!= nullを確認します。 nullの場合、この要素は空の要素として記述する必要があります。この場合、p.CurrentValueはnullなので、空の要素が必要です。下のXml出力には、この要素を次のように記述しています。私には空の要素を正しく書いているように見えますが、間違っていれば私を訂正してください。

XMLファイルの出力は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 

-<element> 
    -<element 1 attrs1="Some Info" attrs2="More Info"> 
     -<element2>  
      +<![CDATA[]]> 
     </element2> 
     -<element3>  
      -<![CDATA[ ]]> 
     </element3>  
     <element4/>  
    </element1>  
</element> 

それから私はバックでXMLファイルを読み込むためのメソッドを作成し、それが壊れる場所です。要素element1、element2、element3を読み込むだけです。しかし、それが要素4に到達すると、私は問題が発生し始めます。私は以下で説明します。

public void ReadXml(XmlReader reader) 
     { 
      if (reader.IsStartElement("element1")) 
      { 
       // 
       // Get the values of all the <element1> attributes 
       // 
       Attrs1= reader.GetAttribute("attrs1"); 
       Attrs2 = reader.GetAttribute("attrs2"); 

       // 
       // Read past <element1> 
       // 
       reader.Read(); 

       while (true) 
       { 
        if (reader.IsStartElement("element2")) 
        { 
         Description = reader.ReadElementContentAsString(); 
        } 
        else if (reader.IsStartElement("element3")) 
        { 
         Source = reader.ReadElementContentAsString(); 
        } 
        else if (reader.IsStartElement("element4")) && (!reader.IsEmptyElement)) 
        { 
         Element4.ReadXml(reader); 
        } 
        else if ((reader.IsStartElement("element5")) && (!reader.IsEmptyElement)) 
        { 
         Element5.ReadXml(reader); 
        } 
        else 
        { 
         reader.MoveToContent(); 
         reader.ReadEndElement(); 
         break; 
        } 
       } 
      } 
      else 
      { 
       throw new XmlException("Expected <element1> element was not present"); 
      } 
     } 

気付いた場合element4 IsStartElement、それが空要素でなければ、それはElement4.ReadXml()を呼び出しますこと:ここでは

は、XmlReaderのメソッドがあります。その方法は次のとおりです:

public void ReadXml(XmlReader reader) 
     { 
      if ((reader.IsStartElement("element4")) && (!reader.IsEmptyElement)) 
      { 
       reader.Read(); 

       while (reader.IsStartElement("property")) 
       { 
        string propertyName = reader.GetAttribute("name"); 
        string propertyValue = reader.GetAttribute("value"); 
        SetValue(propertyName, propertyValue); 
        reader.Read(); 
       } 

       // 
       // Read </element4> 
       // 
       reader.MoveToContent(); 
       reader.ReadEndElement(); 
      }    
     } 

しかし、element4が空であるため、このメソッドは呼び出されません。したがって、else {}ステートメントに続き、reader.ReadEndElement()に到達すると中断します。私が手にあり、エラーメッセージは次のとおりです。

"Message: TestMethod myTestMethodName threw exception: System.Xml.XmlException 'Element' is an invalid XmlNodeType. Line 8, position 6." 

だから私の質問は以下のとおりです。

  1. 要素が空であるため、このですか?もしそうなら、空の要素を閉じたり、読み込んだりするには?
  2. ここで、element4が開始要素で、空でない場合はelement4を読み込んでいます....(reader.IsEmptyElement)を削除すると無限ループになります。 Element4.ReadXml(reader)を呼び出し続けます。どうしてこれなの?
  3. これを修正してこれを続行する方法は、残りの要素を読むことができます。
+0

誰も:ここ

は、それがどのように見えるのですか?思考? – Tim

+0

1)質問を[mcve]に簡略化できますか?これは非常に複雑ですが、Visual Studioにコピー&ペーストするだけでは実行できないという点で不完全です。 2)https://stackoverflow.com/questions/279534/properway-to-implement-ixmlserializable – dbc

+0

をチェックしました申し訳ありませんが、これは私が作ったものと同じくらい単純です。 xmlファイルの読み書きに使用したテストメソッドを既に除外しています。私はそれを考え出した。私は興味のある人のために以下のソリューションを含んでいます。大きな問題に対する簡単な解決策。 – Tim

答えて

0

ここで私のXMLファイルから要素を読み込みましたが、要素が開始要素かどうかを処理するための条件があり、その要素が空の場合は別の要素を追加する必要がありました。空でないかどうかだけ調べていました。それで、それはそれが空であるように扱う方法を知らなかった。これらの条件が満たされたとき、私は単に、アプリケーションに<element4/>のように要素を読み取るように指示するためにreader.Read()を実行しなければなりませんでした。

else if (reader.IsStartElement("element4")) && (reader.IsEmptyElement)) 
    { 
     reader.Read(); 
    } 
関連する問題