向现有XML文件添加其他标记

时间:2012-11-29 22:47:09

标签: c# xml xml-parsing

我有一个包含以下结构的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");    

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

在有人要求大陆变量和国家/地区列表包含所需项目之前,我觉得不需要显示代码中的那一部分。

我在这里做错了什么?

修改

我设法对代码进行了核心处理,现在它的工作属性不是apearing,因为我给了node属性和element属性同名的名字,我现在可以工作了。

3 个答案:

答案 0 :(得分:2)

使用Linq创建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>

答案 1 :(得分: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);
循环结束时

答案 2 :(得分:0)

您正在添加标记国家/地区,但该方法仅返回新创建元素的引用,然后您必须将其明确添加到文档