使用List.Add()方法将我的代码从foreach循环中分离出来

时间:2012-07-03 19:40:30

标签: c# list foreach linq-to-xml

所以,基本上,我遇到了一个有趣的问题,当在下面的代码中调用“CreateXML()”函数时,会按照预期创建一个xelement,但是当我尝试时将它添加到xeleents的集合中,而不是继续调用“CreateXML()”的foreach循环,foreach循环被打破,并调用“WriteXML()” 。此外,虽然创建并填充了XElement,但它不会添加到List中。 [澄清一下,我所说的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循环在第一次迭代后不会中断,并且代码正常工作。

我不知道我做错了什么(是的,代码是由公众成员实例化的,不要担心:我只是在我的问题上发布相关的内部方法)...如果有人来了在此之前的这种行为,我真的很感激推动正确的方向尝试纠正它... Sepcifically:问题只是编码很差,或者这种行为是其中一个方法/库的属性的结果我在用?

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

4 个答案:

答案 0 :(得分:5)

  

我不知道我做错了什么

对于初学者来说:

catch (Exception e) { }

这让你无法看到正在发生的事情。由于NullReferenceException为空,我强烈怀疑您有_xelemlist,但这是次要问题。主要的问题是,通过假装一切都很好无论发生什么,没有任何记录,获得任何地方的唯一方法是通过调试,这是一个非常糟糕的体验,当你不需要经历它。

极少一个好主意捕获异常并吞没它们而不进行任何记录。用Exception来做这件事几乎永远

每当您遇到难以诊断的问题时,请先提高诊断能力。这样,当您 next 遇到问题时,诊断起来会更容易。

答案 1 :(得分:0)

以这种方式声明List

private List<XElement> _xelemlist = new List<XElement>();

答案 2 :(得分:0)

在您的foreach循环中,当您XElement head时,您正试图将add()用作XElements列表。这应该是一个XElements列表?

答案 3 :(得分: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");