所以,基本上,我遇到了一个有趣的问题,当在下面的代码中调用“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来编写所述信息......不要问我为什么。
答案 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");