0

所以,本质上,我遇到了一个有趣的问题,当调用CreateXML()以下代码中的“”函数时,会按预期创建一个 xelement,但是当我尝试将它添加到 xeleents 集合中时,而不是继续调用“ 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()”中的“ CreateXML()”并单步执行代码时,foreach 循环在第一次迭代后没有中断,并且代码可以正常工作。

我不知道我做错了什么(是的,代码是由公共成员实例化的,别担心:我只是将相关的内部方法发布到我的问题中)......如果有人遇到过这种情况之前的行为,我真的很感激朝着正确的方向努力尝试纠正它......特别是:问题只是编码不佳,还是这种行为是我正在使用的方法/库之一的属性的结果?

一个警告:我知道我正在使用 HTMLAgilityPack 来解析文件并提取信息,但是对这段代码的要求迫使我使用 XDocument 来编写所述信息......不要问我为什么。

4

4 回答 4

5

我不知道我做错了什么

这对于初学者来说:

catch (Exception e) { }

这会阻止你看到地球上正在发生的事情。我强烈怀疑你有一个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

在您的 foreach 循环中,您尝试将其XElement head用作 XElements 列表add()。这可能应该是 XElements 的列表?

于 2012-07-03T19:46:01.520 回答
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 回答