使用子节点Xml和C#添加新元素

时间:2013-10-16 18:47:21

标签: c# xml winforms linq-to-xml

我正在编写一个Windows窗体应用程序,我想创建一个xml文件并向其中添加数据。

代码如下。

 xmlFile = new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"),
                    new XComment("XML File for storing " + RootName));
xmlFile.Add(new XElement(RootName));

// Loop through the list and create a new element for each item in the list
foreach (Contact c in contactsList)
{
    try
    {
        xmlFile.Add(new XElement("Contact",
            new XElement("Name", c.Name),
            new XElement("Email", c.EmailAddress),
            new XElement("Mobile Number", c.MobileNumber),
            new XElement("Mobile Carrier", c.sMobileCarrier)
            )
        );
    }
    catch
    {
        MessageBox.Show("ERROR WITH NEW ELEMENTS");
    }
}
xmlFile.Save(FileName);

当我运行程序时,try块抛出并出错,我收到消息框错误。 当我调试时,程序说异常与:

有关
The ' ' character, hexadecimal value 0x20, cannot be included in a name.

我不确定这意味着什么,因为我检查了传入的所有值,直到输入点,这里有一些东西。

我错过了xmlFile.Add()声明中的参数吗?

最后一个问题,当我在创建XDocument对象后插入Root元素时, 它在文件中显示为<Contacts />,我希望它是关闭的根标记。

如何插入起始标记,然后当我在结尾处保存时,它会附加结束标记?

由于

更新--------------------- 感谢MarcinJuraszek,我能够超越抛出的异常,但现在我收到了这个错误:

This operation would create an incorrectly structured document.

任何想法是什么意思或导致它的原因?

1 个答案:

答案 0 :(得分:2)

错误消息是明确的:XML元素名称不能包含空格。你正试图这样做:

        new XElement("Mobile Number", c.MobileNumber),
        new XElement("Mobile Carrier", c.sMobileCarrier)

将这些行更改为不包含空格,它应该有效。 e.g。

        new XElement("MobileNumber", c.MobileNumber),
        new XElement("MobileCarrier", c.sMobileCarrier)
  

如何插入起始标记,然后当我在结尾处保存时,它会附加结束标记?

不要担心开始/关闭标签。 XElement.Save方法会处理这个问题。

更新

这里的第二个问题是,您正在尝试使用多个根元素创建文档。这是因为您不是将新内容添加到根XElement中,而是尝试将其直接添加到XDocument实例中。

请尝试以下操作:

    xmlFile.Root.Add(new XElement("Contact",
        new XElement("Name", c.Name),
        new XElement("Email", c.EmailAddress),
        new XElement("MobileNumber", c.MobileNumber),
        new XElement("MobileCarrier", c.sMobileCarrier)
        )