使用c#将内联XML节点转换为asp.net中的嵌套节点

Ham*_*ebi 5 c# xml asp.net

我有一个XML文件,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<LayoutControl ID="rootlyt" Type="LayoutControl">
  <LayoutGroup ID="lgp8" Header="PersonalInfo" IsCollapsed="False" IsLocked="False" Orientation="Vertical" View="GroupBox" HorizontalAlignment="Left" VerticalAlignment="Top" Width="380" Height="295" Type="GroupItem" Properties="IsCollapsible=False,IsCollapsed=False,IsLocked=False,">
    <Element ID="layout2" HorizontalAlignment="Left" VerticalAlignment="Top" Width="300" Height="25" Label="Name" Background="#00FFFFFF" ContentName="txt2" Type="TextEdit" />
  </LayoutGroup>
</LayoutControl>  
Run Code Online (Sandbox Code Playgroud)

出于某些原因,我需要从Element节点创建子节点和嵌套节点attributes.
我想要的输出是:

<?xml version="1.0" encoding="utf-8" ?>
<LayoutControl ID="rootlyt" Type="LayoutControl">
  <LayoutGroup ID="lgp8" Header="PersonalInfo" IsCollapsed="False" IsLocked="False" Orientation="Vertical" View="GroupBox" HorizontalAlignment="Left" VerticalAlignment="Top" Width="380" Height="295" Type="GroupItem" Properties="IsCollapsible=False,IsCollapsed=False,IsLocked=False,">
    <Element >
      <ID>layout2</ID>
      <HorizontalAlignment>Left</HorizontalAlignment>
      <VerticalAlignment>Top</VerticalAlignment>
      <Width>300</Width>
      <Height>25</Height>
      <Label>Name</Label>
      <Background>#00FFFFFF</Background>
      <ContentName>txt2</ContentName>
      <Type>TextEdit</Type>
    </Element>
  </LayoutGroup>
</LayoutControl>  
Run Code Online (Sandbox Code Playgroud)

我该怎么做?
或任何想法,参考,文章......

谢谢.

har*_*r07 4

这是一种可能的方式;为每个<Element>属性添加一个相应的子元素,然后删除所有属性:

var raw = @"<LayoutControl ID='rootlyt' Type='LayoutControl'>
  <LayoutGroup ID='lgp8' Header='PersonalInfo' IsCollapsed='False' IsLocked='False' Orientation='Vertical' View='GroupBox' HorizontalAlignment='Left' VerticalAlignment='Top' Width='380' Height='295' Type='GroupItem' Properties='IsCollapsible=False,IsCollapsed=False,IsLocked=False,'>
    <Element ID='layout2' HorizontalAlignment='Left' VerticalAlignment='Top' Width='300' Height='25' Label='Name' Background='#00FFFFFF' ContentName='txt2' Type='TextEdit' />
  </LayoutGroup>
</LayoutControl>";

var doc = XDocument.Parse(raw);
foreach(var element in doc.Descendants("Element"))
{
    //add a series of child elements according to existing attributes
    element.Add(
        element.Attributes()
               .Select(attribute => new XElement(attribute.Name.LocalName, attribute.Value))
    );

    //remove the attributes
    element.Attributes().Remove();
}

Console.WriteLine(doc.ToString());
Run Code Online (Sandbox Code Playgroud)

dotnetfiddle demo

对于更复杂的 XML 转换,请查看 XSLT。