2

簡単にするために、プロジェクトの複雑さを大幅に軽減し、私が苦労していることの単純で正確な例を示します。2 つの XML ファイルがあり、それらRead.xmlを および と呼びますWrite.xml。目標は、プロジェクトでRead.xmlの内容を読み取り、XML をクラスに解析してから、それをWrite.xmlに再構築することです。

XML がRead.xmlに生成される方法は、要素に値がない場合は短縮形の終了タグ ( <ElementName />) を使用し、値がある場合は長い形の終了タグ ( <ElementName>Element Value</ElementName>) を使用します。Read.xmlでの XML の生成を制御することはできません。

以下のコードは、長い手書きの終了タグを使用している限り、XML の解析に最適です。ただし、 ReportId以下に省略形の終了タグがある場合、現在のコードは次の行を読み取ります (長い手書きの終了タグの場合、XML 要素の値になります)。ただし、次の行は空白です。値が"\n"の要素。これにより、 Write.xmlの XML に新しい行が追加され 、XML 形式が奇妙になります。Read.xmlから XML を読み取って解析するために使用するコードは次のとおりです。

        while(xmlReader.Read())
        {
            switch(xmlReader.NodeType)
            {
                case XmlNodeType.Element:
                    if(xmlReader.Name.Equals("ReportSummary") && xmlReader.IsStartElement())
                    {
                        currentReport = new Entities.Report();
                    }
                    else if(xmlReader.Name.Equals("ReportName"))
                    {
                        xmlReader.Read();
                        currentReport.ReportName = xmlReader.Value;
                    }
                    else if(xmlReader.Name.Equals("ReportId"))
                    {
                        xmlReader.Read();
                        currentReport.ReportId = xmlReader.Value;
                    }
                    break;
                case XmlNodeType.EndElement: //Reached the end of the element.
                    if(xmlReader.Name.Equals("ReportSummary"))
                    {
                        if(currentReport!= null)
                        {
                            reportList.Add(currentReport);
                            currentReport = null;
                        }
                    }
                    break;
                default:
                    break;
            }
        }

私の質問は、短縮形の終了タグと長い閉鎖タグを処理する適切な方法があるかどうかです。または、XML ファイルをまとめて解析するより良い方法はありますか?

提供されたすべての前もって感謝します。

4

4 に答える 4

4

XmlReader.IsEmptyElementリーダーが空の要素にあるかどうかを判断するために使用できます: http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.isemptyelement.aspx

于 2012-08-06T19:34:40.747 に答える
2

可能であれば、LINQ to XML を使用できます...

すべてが簡単になると考えてください。

http://msdn.microsoft.com/en-us/library/bb387098.aspx

それが役に立てば幸い...

于 2012-08-06T19:36:18.353 に答える
0

XmlDocument の SelectSingleNode 関数を使用すると、ファイルの解析がより効率的になります。

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectsinglenode.aspx

複数のノードがある場合は、SelectNodes 関数を使用できます。

http://msdn.microsoft.com/en-us/library/4bektfx9.aspx

spender が指摘しているように、XDocument/XElement を使用して解析することもできます。少なくともフレームワーク 3.5 を使用している場合は、このアプローチが望ましい場合があります。

于 2012-08-06T19:34:28.297 に答える
0


パフォーマンスは少し劣るが、より管理しやすい方法を選択する傾向がある場合は、次のような解決策をお勧めします。

    XmlDocument xmlDoc = new XmlDocument();
    List<Entities.Report> reports = new List<Entities.Report>();
    xmlDoc.Load("Read.xml");
    foreach (XmlNode reportNode in xmlDoc.SelectNodes("//ReportSummary"))
    {
        Entities.Report report = new Entities.Report();
        report.ReportName = reportNode["ReportName"].InnerText;
        report.ReportId = reportNode["ReportId"].InnerText;
        reports.Add(report);
    }

はるかに読みやすく、保守しやすく、パフォーマンスが少し低下します。
幸運を!

于 2012-08-06T19:36:22.090 に答える