我正在尝试从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>
答案 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
元素,只有正确的标题文本,或者其他什么)但是如果失败了,我认为你留下了一些东西就像我上面概述的那样。
还不清楚你为什么要开始新的列表而不是列出项目,但这是另一回事......