0

一部の入力に対してコンテンツがCDATAタグとともに渡されるxmlタグを解析する方法を見つけようとしていますが、すべてではありません。

たとえば、以下は、CDATAタグを含むデータに対して受け取るサンプルコンテンツです。ただし、CDATAタグが省略されるシナリオは他にもいくつかあります。

<Data><![CDATA[ <h1>CHAPTER 2<br/> EDUCATION</h1>
                <P>  Analysis paragraph  </P> ]]></Data>

どういうわけかそれを検出し、両方のタイプの入力(CDATAの有無にかかわらず)を解析できるReadXmlメソッドを実装するための洗練された方法はありますか?これまでのところ、ReadXml()の実装は次のとおりですが、CDATAタグを省略すると解析中にエラーが発生します。

    public void ReadXml(XmlReader reader)
    {
        bool isEmpty = reader.IsEmptyElement;
        reader.ReadStartElement();
        if (isEmpty)
        {
            _data = string.Empty;
        }
        else
        {                
            switch (reader.MoveToContent())
            {
                case XmlNodeType.Text:
                case XmlNodeType.CDATA:
                    _data = reader.ReadContentAsString();
                    break;
                default:
                    _data = string.Empty;
                    break;
            }
            reader.ReadEndElement();
        }                         
    }
4

1 に答える 1

1

以下のコードは、次のサンプルでテストされています。

<Data><h1>CHAPTER 2<br/> EDUCATION</h1><P>  Analysis paragraph  </P></Data>
<Data>test<h1>CHAPTER 2<br/> EDUCATION</h1><P>  Analysis paragraph  </P></Data>
<Data><![CDATA[ <h1>CHAPTER 2<br/> EDUCATION</h1><P>  Analysis paragraph  </P> ]]></Data>
<Data></Data>

バックトラックが可能になるため、代わりにXPathNavigatorを使用します。

public void ReadXml(XmlReader reader)
{
    XmlDocument doc = new XmlDocument {PreserveWhitespace = false};
    doc.Load(reader);

    var navigator = doc.CreateNavigator();
    navigator.MoveToChild(XPathNodeType.Element);
    _data = navigator.InnerXml.Trim().StartsWith("&lt;") ? navigator.Value : navigator.InnerXml;
}
于 2010-02-16T20:27:13.167 に答える