0

我有一个包含以下结构的 xml 文件

   <Planet>
      <Continent name="Africa">
        <Country name="Algeria" />
        <Country name="Angola" />
          ...
      </Continent>
    </Planet>

我需要在其中添加包含城市的其他大陆标签。这是我的代码:

       public static string continent;
       public static List<string> countries = new List<string>();

       XmlDocument xDoc = new XmlDocument();
       xDoc.Load(@"D:\Projects IDE\Visual Studio\Tutorial\e-commerce\classModeling\GenerateXml file\GenerateXml file\bin\Debug\Planet.xml");

        XmlNode xNode = xDoc.CreateNode(XmlNodeType.Element, "Continent", "");
        XmlAttribute xKey = xDoc.CreateAttribute("name");
        xKey.Value = continent;
        xNode.Attributes.Append(xKey);
        xDoc.GetElementsByTagName("Planet")[0].InsertAfter(xNode , xDoc.GetElementsByTagName("Planet")[0].LastChild);


        foreach (var country in countries)
        {
            XmlElement root = xDoc.CreateElement("Country");
            XmlAttribute xsKey = xDoc.CreateAttribute("name");
            xsKey.Value = country;
            root.Attributes.Append(xKey);

        }     
        xDoc.Save(@"D:\Projects IDE\Visual Studio\Tutorial\e-commerce\classModeling\GenerateXml file\GenerateXml file\bin\Debug\Planet.xml");    

我的代码创建了所有标签,但不添加属性。

在任何人询问大陆变量和国家列表包含所需项目之前,我只是觉得不需要显示代码二的那部分。

我在这里做错了什么?

编辑

我设法纠正了代码,现在它工作了,属性没有出现,因为我给节点属性和元素属性都赋予了相同的名称,我更改了名称,现在它可以工作了。

4

3 回答 3

2

使用 Linq to XML 创建 xml 非常容易:

XDocument xdoc = XDocument.Load(path_to_xml);
xdoc.Root.Add(
    new XElement("Continent", 
        new XAttribute("name", continent),
        from country in countries
        select new XElement("Country", new XAttribute("name", country))));
xdoc.Save(path_to_xml);

此代码将向元素添加另一个<Continent>元素(带有提供的国家/地区)Planet。例如以下数据

continent = "Europe";
countries = new List<string>() { "Spain", "France", "Italy", "Belarus" };

输出将是

<Planet>
  <Continent name="Africa">
    <Country name="Algeria" />
    <Country name="Angola" />
  </Continent>
  <Continent name="Europe">
    <Country name="Spain" />
    <Country name="France" />
    <Country name="Italy" />
    <Country name="Belarus" />
  </Continent>
</Planet>
于 2012-11-29T22:59:41.807 回答
1

好吧,在下面的循环中

    foreach (var country in countries)
    {
        XmlElement root = xDoc.CreateElement("Country");
        XmlAttribute xsKey = xDoc.CreateAttribute("name");
        xsKey.Value = continent;
        root.Attributes.Append(xKey);

    }   

你正在创建你的Country元素,但是你没有对它做任何事情并且root超出了范围。您是否打算将其添加到您的Continent标签中?

也许你想添加

xNode.AppendChild(root);

在循环结束时

于 2012-11-29T22:50:54.400 回答
0

您正在添加标签国家,但该方法只为您提供新创建元素的引用,然后您必须将其显式添加到文档中

于 2012-11-29T22:53:01.217 回答