将XDocument加载到HTML未排序列表中

时间:2013-12-18 08:02:41

标签: c# html xml asp.net-mvc-3 linq-to-xml

我正在尝试从Unsorted List加载XML file

必须将父标记加载到ul,并将子标记加载到ol

问题是,我无法单独获取父级,它始终打印父级值及其子级。


XML文件:

<Sections>
  <Section id="D2F4CD35-FB7A-4E24-9CC3-7C2095D1A2D5">
    <![CDATA[ <PARENT 1> ]]>
    <SubSection>
      <![CDATA[ <CHILED 1.1> ]]>
    </SubSection>
    <SubSection>
      <![CDATA[ <CHILED 1.2> ]]>
    </SubSection>
  </Section>

  <Section  id="CF7F2212-A4DB-47AA-8129-61AF2F930C2C">
    <![CDATA[ <PARENT 2> ]]>
    <SubSection>
      <![CDATA[ <CHILED 2.1> ]]>
    </SubSection>
    <SubSection>
      <![CDATA[ <CHILED 2.2> ]]>
    </SubSection>
  </Section>
</Sections>

C#代码:

XDocument xmlDoc = XDocument.Load("C:/SectionXmlFile.xml");
    var parents = xmlDoc.Element("Sections");
    if (parents != null) {
        foreach (var parent in parents.Descendants("Section")) {    
            <ul>@parent.Value</ul>
            foreach (var child in parent.Descendants("SubSection")) {
                <ol>@child.Value</ol>
            }
        }
    }

  

结果:

<PARETN 1> <CHILED 1.1> <CHILED 1.2>

<CHILED 1.1>

<CHILED 1.2>

<PARETN 2> <CHILED 2.1> <CHILED 2.2>

<CHILED 2.1>

<CHILED 2.2>

  

预期结果:

<PARETN 1>

   <CHILED 1.1>

   <CHILED 1.2>

<PARETN 2>

   <CHILED 2.1>

   <CHILED 2.2>

1 个答案:

答案 0 :(得分:1)

我怀疑这是问题所在:

<ul>@parent.Value</ul>

关闭 <ul>标记,而不是包含其中的每个子元素。

您获得CHILED元素两次的原因是您正在使用XElement.Value找到所有父级下的文本节点。您只需要立即子文本节点。

我怀疑你可能想要:

foreach (var parent in parents.Descendants("Section")) {    
    <ul>@(parent.Nodes().OfType<XText>().First().Value)
    foreach (var child in parent.Descendants("SubSection")) {
        <ol>@child.Value</ol>
    }
    </ul>
}

(至少在概念上 - 剃刀语法可能稍微偏离......)

这种找到第一个文本节点的方式无疑是令人恼火的。如果你可以改变你的XML会使它更容易(例如,使每个Section元素都有一个Title元素,只有正确的标题文本,或者其他什么)但是如果失败了,我认为你留下了一些东西就像我上面概述的那样。

还不清楚你为什么要开始新的列表而不是列出项目,但这是另一回事......