1

XmlTextReaderクラスでxmlファイルを読み込もうとしています。xmlファイルは

<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<AppXmlLogWritter>
<LogData><LogID>999992013021213232800001</LogID><LogDateTime>20130212132328</LogDateTime><LogType>Message</LogType><LogFlag>Flag</LogFlag><LogApplication>Application</LogApplication><LogModule>Module</LogModule><LogLocation>Location</LogLocation><LogText>Text</LogText><LogStackTrace>Stacktrace</LogStackTrace></LogData>
</AppXmlLogWritter>

次のコードで

FileStream fileStream = File.Open(txtBrowseFilePath.Text, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
             using (XmlTextReader objXmlReader = new XmlTextReader(fileStream))
{
                IEnumerable<LogData> data = LogData.GetLogData(objXmlReader);

                using(var item = data.GetEnumerator())
                {
                    while (item.MoveNext())
                    {
                        DataRow dataRow;
                        dataRow = dataTable.NewRow();

                        dataRow[0] = item.Current.LogID;
                        dataRow[1] = item.Current.LogDateTime;
                        dataRow[2] = item.Current.LogType;
                        dataRow[3] = item.Current.LogFlag;
                        dataRow[4] = item.Current.LogApplication;
                        dataRow[5] = item.Current.LogModule;
                        dataRow[6] = item.Current.LogLocation;
                        dataRow[7] = item.Current.LogText;
                        dataRow[8] = item.Current.LogStackTrace;

                        dataTable.Rows.Add(dataRow);
                    }
                }}
public static IEnumerable<LogData> GetLogData(XmlTextReader objXmlReader)
        {
            LogData objLogData = null;
            IXmlLineInfo xmlInfo = (IXmlLineInfo)objXmlReader;
            while(objXmlReader.Read())
            {


                if(objXmlReader.IsStartElement("LogData"))
                {
                    objLogData = new LogData();
                }
                if(objXmlReader.Name == "LogData" && objXmlReader.NodeType == XmlNodeType.EndElement)
                {
                    yield return objLogData;
                }
                if(objXmlReader.Name == "LogID")
                {
                    objLogData.LogID = objXmlReader.ReadElementContentAsString();
                }
                else if (objXmlReader.Name == "LogDateTime")
                {          
                    objLogData.LogDateTime = objXmlReader.ReadElementContentAsString();                   
                }
                else if(objXmlReader.Name == "LogType")
                {
                    objLogData.LogType = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogFlag")
                {
                    objLogData.LogFlag = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogApplication")
                {
                    objLogData.LogApplication = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogModule")
                {
                    objLogData.LogModule = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogLocation")
                {
                    objLogData.LogLocation = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogText")
                {
                    objLogData.LogText = objXmlReader.ReadElementContentAsString();
                }
                else if(objXmlReader.Name == "LogStackTrace")
                {
                    objLogData.LogStackTrace = objXmlReader.ReadElementContentAsString();
                }
            }
        }

しかし、 「ReadElementContentAsStringメソッドはノードタイプEndElementではサポートされていません」というエラーが表示されます が、xmlファイルが次のようになっている場合

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AppXmlLogWritter>
<LogData>
<LogID>999992013021110381000001</LogID>
<LogDateTime>20130211103810</LogDateTime>
<LogType>Message</LogType>
<LogFlag>Flag</LogFlag>
<LogApplication>Application</LogApplication>
<LogModule>Module</LogModule>
<LogLocation>Location</LogLocation>
<LogText>Text</LogText>
<LogStackTrace>Stacktrace</LogStackTrace>
</LogData>
</AppXmlLogWritter>

それは正常に動作しますが、上記のxmlファイルの実際の問題が何であるかをまだ理解していません。この行でエラーが発生しました

 objLogData.LogDateTime = objXmlReader.ReadElementContentAsString();  

返信用のThnkx

4

2 に答える 2

2

さて、問題の主な原因は、あなたが読んでいる要素のReadElementContentAsStringに「カーソル」を移動するものを使用していることです-しかし、あなたはそれから再び呼び出しています。Read()

したがって、XMLデータが次のようになっている場合:

<first>Foo</first><second>Bar</second>

...first要素の開口部にいる場合ReadElementContentAsStringは、リーダーをsecond要素の先頭に移動します。次に、どちらを呼び出しRead()てテキストノード(「バー」)に移動します。次に2回目の呼び出しReadElementContentAsStringを行うと、失敗します。これは、要素の開始ノードを使用していないためです。ただし、次の例外が発生することを期待しています。

Unhandled Exception: System.InvalidOperationException:
The ReadElementContentAsString method is not supported on node type Text.

...ノードタイプがEndElement、何らかの理由であるのに対して。

なぜそれが起こっているのかを正確に掘り下げる必要があります(Readたとえば、デバッグ中に手動で呼び出しましたか?)が、修正する必要がある根本的な問題は、必要のRead()ないときに呼び出すことです。

于 2013-02-12T14:07:04.053 に答える
0

あなたはmsdnページIXmlLineInfoから使用しています:

クラスが行と位置の情報を返すことができるようにするためのインターフェースを提供します。

これがこのエラーの原因である可能性があります。yield return(呼び出されることはないので)を使用して何も返されないと思います。item.MoveNext()結果を使用objXmlReaderすると、xmlの最後の要素に移動し、例外が発生します。

これは、提供されたデータに基づく単なる推測であることに注意してください。

于 2013-02-12T13:46:20.113 に答える