0

したがって、基本的にCreateXML()、次のコードで ""関数を呼び出すと、意図したとおりにxelementが作成されるという興味深い問題が発生しますが、それをxeleentのコレクションに追加しようとすると、" CreateXML()"の呼び出しが開始されたforeachループを続行する代わりに、 foreachループが解除され、" WriteXML()"が呼び出されます。さらに、XElementが作成されて入力されますが、リストには追加されません。[明確にするために、私が参照しているforeachループは" ParseDoc()"メソッドに存在します]

    private List<XElement> _xelemlist;
    private void WriteXml()
    {
        XElement head = new XElement("header", new XAttribute("headerattributename", "attribute"));
        foreach (XElement xelem in _xelemlist)
        {
            head.Add(xelem);
        }
        XDocument doc = new XDocument();
        doc.Add(head);

    }
    private void CreateXML(string attname, string att)
    {
        XElement xelem = new XElement("name", new XElement("child", new XAttribute(attname, att), segment));
        _xelemlist.Add(xelem);
    }
    private void ExtractSegment(HtmlNode node)
    {
        HtmlAttribute[] segatts = node.Attributes.ToArray();
        string attname = segatts[0].Value.ToString();
        string att = node.InnerText.ToString();
        CreateXML(attname, att);
    }
    private HtmlDocument ParseDoc(HtmlDocument document)
    {
        try
        {
            HtmlNode root = document.DocumentNode.FirstChild;
            foreach (HtmlNode childnode1 in root.SelectNodes(".//child1"))
            {
                foreach (HtmlNode childnode2 in node.SelectNodes(".//child2"))
                {
                    ExtractSegment(childnode2);
                }
            }
        }
        catch (Exception e) { }
        WriteXml();
        return document;
    }

List.Add()" " in " "をコメントアウトしてCreateXML()コードをステップ実行すると、最初の反復後にforeachループが中断されず、コードは正しく機能します。

私は自分が何を間違っているのかわかりません(そして、はい、コードはパブリックメンバーによってインスタンス化されます、心配しないでください:私は自分の問題に関連する内部メソッドを投稿するだけです)...誰かがこの種に遭遇した場合以前の動作の場合、修正を試みるために正しい方向にプッシュしていただければ幸いです...具体的には、問題はコーディングが不十分なだけなのか、それともこの動作は私が使用しているメソッド/ライブラリの1つのプロパティの結果なのか?

1つの警告:HTMLAgilityPackを使用してファイルを解析し、情報を抽出していることは知っていますが、このコードの要件により、XDocumentを使用して上記の情報を書き込む必要があります...理由を聞かないでください。

4

4 に答える 4

5

何が間違っているのかわからない

これは、初心者向けです。

catch (Exception e) { }

それはあなたが地球上で何が起こっているのか見るのを止めています。nullがNullReferenceException原因であると強く思いますが、それは二次的な問題です。主な問題は、何が起こってもすべてがうまくいくふりをして、ログをまったく記録せずに、どこにでも行く唯一の方法はデバッグすることです。これは、それを実行する必要がない場合のひどい経験です。_xelemlist

例外をキャッチして、ログをまったく記録せずにそれらを飲み込むことは非常にまれです。でそれを行うことはほとんど決して良い考えではありませんException

診断が難しい問題がある場合は、まず診断機能を向上させてください。そうすれば、次に問題が発生したときに、診断が容易になります。

于 2012-07-03T19:43:19.583 に答える
0

Listこのように宣言し、

private List<XElement> _xelemlist = new List<XElement>();
于 2012-07-03T19:43:27.280 に答える
0

XmlDocumentの使用に切り替えることをお勧めしますか?

これは私が仕事用に書いたサンプルコードです (私の仕事を保護するために変更しました:D)。

コード:

XmlDocument doc = new XmlDocument();
XmlNode root;
if(File.Exists(path + "\\MyXmlFile.xml"))
{
    doc.Load(path + "\\MyXmlFile.xml");
    root = doc.SelectSingleNode("//Library");
}
else
{    
    XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
    doc.AppendChild(dec);
    root = doc.CreateElement("Library");
    doc.AppendChild(root);
}

XmlElement book = doc.CreateElement("Book");
XmlElement title = doc.CreateElement("Title");
XmlElement author = doc.CreateElement("Author");
XmlElement isbn = doc.CreateElement("ISBN");

title.InnerText = "Title of a Book";
author.InnerText = "Some Author";
isbn.InnerText = "RandomNumbers";

book.AppendChild(title);
book.AppendChild(author);
book.AppendChild(isbn);
root.AppendChild(book);

doc.Save(path + "\\MyXmlFile.xml");
于 2012-07-03T20:02:41.710 に答える
0

foreach ループではXElement head、XElements のリストとして使用しようとしadd()ています。これはおそらく XElements のリストでしょうか?

于 2012-07-03T19:46:01.520 に答える