0

後の手順で読み取る XML インデックス ファイルを作成しています。可変長配列があり、それらを 1 つのファイルに書き込んでいます。

問題があります。リーダー コード内にあると思います。何らかの理由で、TimeStamp 要素と Long 要素は正しく配列に読み込まれますが、Lat 要素と VideoFile 要素はスキップされます。何らかの理由で、reader.nodetype が返されません。read() メソッドがそれらを取得する唯一の方法は TEXT nodetype であり、その後は innerxml 値のみを表示しますが、これは私には役に立ちません。

XML ファイルの例を保存すると、以下のコードは完全に実行可能になります。

繰り返しになりますが、stack ユーザーに感謝します。

創造

    using System.Xml;        
    XmlTextWriter xmlwriter = new XmlTextWriter(file, null);
    xmlwriter.Formatting = Formatting.Indented;
    //xmlwriter.Indentation = 4;
    xmlwriter.WriteStartDocument();
    xmlwriter.WriteStartElement("Index");

    for (int i = 0; i < malLat.Count; i++)
    {
        xmlwriter.WriteStartElement("Marker");

        xmlwriter.WriteStartElement("TimeStamp");
        xmlwriter.WriteString(malTimes[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteStartElement("Lat");
        xmlwriter.WriteString(malLat[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteStartElement("Long");
        xmlwriter.WriteString(malLong[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteStartElement("VideoFile");
        xmlwriter.WriteString(malVideoTitle[i].ToString());
        xmlwriter.WriteEndElement();

        xmlwriter.WriteEndElement();
    }
    xmlwriter.WriteEndElement();
    xmlwriter.WriteEndDocument();
    xmlwriter.Close();

読む

using System.Xml;  
XmlTextReader lxmlReader = new XmlTextReader(mstrIndexFile + ".xml");
lxmlReader.WhitespaceHandling = WhitespaceHandling.None;

while (lxmlReader.Read())
{
    if (lxmlReader.NodeType == XmlNodeType.Element)
    {
        if (lxmlReader.Name == "TimeStamp")
        {
            malTimes.Add(lxmlReader.ReadInnerXml().ToString());
        }
        else if (lxmlReader.Name == "Lat")
        {
            malLat.Add(lxmlReader.ReadInnerXml().ToString());
        }
        else if (lxmlReader.Name == "Long")
        {
            malLong.Add(lxmlReader.ReadInnerXml().ToString());
        }
        else if (lxmlReader.Name == "VideoFile")
        {
            malVideoTitle.Add(lxmlReader.ReadInnerXml().ToString());
        }
    }
}

lxmlReader.Close();

XML ドキュメントのサンプル

    <Index>
      <Marker>
        <TimeStamp>2011-7-17 23:18:39</TimeStamp>
        <Lat>-121.261953323166</Lat>
        <Long>43.0594755392741</Long>
        <VideoFile>C:\Users\kpenner\Desktop\Video Dev\1_1.wmv</VideoFile>
      </Marker>
      <Marker>
        <TimeStamp>2011-7-17 23:18:40</TimeStamp>
        <Lat>-122.260755</Lat>
        <Long>46.05878</Long>
        <VideoFile>C:\Users\kpenner\Desktop\Video Dev\1_1.wmv</VideoFile>
      </Marker>
    </Index>
4

1 に答える 1

1

XmlTextReader の問題は、前方のみのリーダーです。リーフ ノードのリーダーに対して ReadInnerXml を実行すると、リーダーは次の要素に移動します ( http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readinnerxml.aspxを参照)。したがって、この場合、TimeStamp をヒットして ReadInnerXml を実行すると、これら 4 つの要素がリーフ ノードであるため、リーダーは Lat Element タイプに移動します。次に、リーダーを Lat の Text 要素に移動する while ループで再度読み取ります。Element タイプのみをチェックしているため、Long をヒットすると、同じ理由で VideoFile が壊れるまで、それ自体が機能します。

これは、ソリューションに役立つ可能性のある回答を含む別の SO 質問へのリンクです: XMLTextReader not reading an element content

于 2012-05-08T15:22:13.780 に答える