使用c#.net中的嵌套参数生成XML

时间:2014-01-03 11:57:14

标签: c# xml linq-to-xml

我想通过解析以下xml来生成带参数的XML。我在c#.net。

工作
<root>
    <name1>
        <names>
           <id>5</id>
           <class>space</class>
           <from>Germany</from>
           <to>France</to>
           <through>
               <via>
                   <id>4</id>
                   <route>Zurich<route>
               </via>
               <via>
                   <id>7</id>
                   <route>Vienna<route>
               </via>
           </through>           
        </names>
    </name1>
    <name2>
      <newNames>
          <id>8</id>
          <path>Road</path>
          <dest>USA</dest>
          <through>
              <route1>
                  <id>5</id>
                  <naviagte>Britain</naviagte>
              </route1>
              <route1>
                  <id>2</id>
                  <naviagte>Canada</naviagte>
              </route1>
          </through>              
      </newNames>
    </name2>
</root>

我希望将其转换为以下内容 -

<root>
        <name1>
            <names id = "5";class = "space"; from = "Germany" ; to = "France">    
                <through>
                   <via id = "4" ; route = "Zurich">                                       
                   <via id = "7" ; route = "Vienna">        
               </through>           
            </names>
        </name1>
        <name2>
          <newNames id = "8"; path = "Road"; dest = "USA">
          <newNames id = "8"; path = "Road"; dest = "USA">
          <through>
               <route1 = id = "5" ; naviagte = "Britain">
               <route1 = id = "2" ; naviagte = "Canada">
          </through>              
        </name2>
    </root>

我尝试了以下代码。

var doc = XDocument.Load("xml_file.xml");
Console.WriteLine(doc.ToString());
var names = doc.Descendants("name");
var newRootElement = new XElement("root");
foreach (var name in names)
{
    var newNameElement = new XElement(name.Name);
    foreach (var element in name.Elements())
    {
        newNameElement.SetAttributeValue(element.Name, element.Value);
    }
    newRootElement.Add(newNameElement);
}
Console.WriteLine(newRootElement.ToString());
newRootElement.Save("converted_xml_file.xml");

但我无法解析所有节点。请问有人在我的代码中给我任何提示或更正吗?

1 个答案:

答案 0 :(得分:1)

我想你已经在输入xml中关闭了route个标签。如果是这样,那么您可以通过查询原始xml并使用属性替换元素来构建新的xml:

var xdoc = XDocument.Load("xml_file.xml");
var root =
    new XElement("root",
        from name in xdoc.Root.Elements()
        select new XElement(name.Name,
            from names in name.Elements()
            select new XElement(names.Name,
                from namesElement in names.Elements()
                where namesElement.Name.LocalName != "through"
                select new XAttribute(namesElement.Name.LocalName, (string)namesElement),
                new XElement("through",
                    from route in names.Element("through").Elements()
                    select new XElement(route.Name,
                        from routeElement in route.Elements()
                        select new XAttribute(routeElement.Name.LocalName, (string)routeElement))))));

此代码生成以下xml:

<root>
  <name1>
    <names id="5" class="space" from="Germany" to="France">
      <through>
        <via id="4" route="Zurich" />
        <via id="7" route="Vienna" />
      </through>
    </names>
  </name1>
  <name2>
    <newNames id="8" path="Road" dest="USA">
      <through>
        <route1 id="5" naviagte="Britain" />
        <route1 id="2" naviagte="Canada" />
      </through>
    </newNames>
  </name2>
</root>