【发布时间】:2019-04-28 07:10:01
【问题描述】:
我的 XML 如下:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:ev="http://www.w3.org/2001/xml-events" xml:lang="de">
<head>
<title>Some Title</title>
<link rel="stylesheet" type="text/css" href="../Styles/9783748258957.css"/>
</head>
<body>
<div id="Inhalt">
<p class="toc-ch"><span class="bi">4 Main Value</span></p>
<p class="toc-h1">4.1 Child Value 1</p>
<p class="toc-h1">4.2 Child Value 2</p>
<p class="toc-h1">4.3 Child Value 3</p>
<p class="toc-h2">4.3.1 Grand-child Value</p>
<p class="toc-h2">4.3.2 Grand-child Value</p>
<p class="toc-h2">4.3.3 Grand-child Value</p>
<p class="toc-h2">4.3.4 Grand-child Value</p>
<p class="toc-h1">4.4 Child Value 4</p>
<p class="toc-h2">4.4.1 Grand-child Value</p>
<p class="toc-h2">4.4.2 Grand-child Value</p>
<p class="toc-h2">4.4.3 Grand-child Value</p>
<p class="toc-h2">4.4.4 Grand-child Value</p>
<p class="toc-h1">4.5 Child Value 5</p>
</div>
</body>
</html>
我想要以下结构的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="de">
<head>
<title>Some Title</title>
<link rel="stylesheet" type="text/css" href="../Styles/9783748258957.css"/>
</head>
<body>
<navMap>
<navPoint id="navPoint-01" playOrder="01"><navLabel><text>4 Main Value</text></navLabel>
<navPoint id="navPoint-02" playOrder="02"><navLabel><text>4.1 Child Value 1</text></navLabel></navPoint>
<navPoint id="navPoint-03" playOrder="03"><navLabel><text>4.2 Child Value 2</text></navLabel></navPoint>
<navPoint id="navPoint-04" playOrder="04"><navLabel><text>4.3 Child Value 3</text></navLabel>
<navPoint id="navPoint-05" playOrder="05"><navLabel><text>4.3.1 Grand-child Value</text></navLabel></navPoint>
<navPoint id="navPoint-06" playOrder="06"><navLabel><text>4.3.2 Grand-child Value</text></navLabel></navPoint>
<navPoint id="navPoint-07" playOrder="07"><navLabel><text>4.3.3 Grand-child Value</text></navLabel></navPoint>
<navPoint id="navPoint-08" playOrder="08"><navLabel><text>4.3.4 Grand-child Value</text></navLabel></navPoint></navPoint>
<navPoint id="navPoint-09" playOrder="09"><navLabel><text>4.4 Child Value 4</text></navLabel>
<navPoint id="navPoint-10" playOrder="10"><navLabel><text>4.4.1 Grand-child Value</text></navLabel></navPoint>
<navPoint id="navPoint-11" playOrder="11"><navLabel><text>4.4.2 Grand-child Value</text></navLabel></navPoint>
<navPoint id="navPoint-12" playOrder="12"><navLabel><text>4.4.3 Grand-child Value</text></navLabel></navPoint>
<navPoint id="navPoint-13" playOrder="13"><navLabel><text>4.4.4 Grand-child Value</text></navLabel></navPoint></navPoint>
<navPoint id="navPoint-14" playOrder="14"><navLabel><text>4.5 Child Value 5</text></navLabel></navPoint></navPoint>
</navMap>
</body>
</ncx>
如何使用foreach 循环实现这一点?
我想嵌套基于class 属性的元素。所以,toc-ch 是主要元素,toc-h1 位于 toc-ch 之下,toc-h2 位于 toc-h1 之下
我无法使其嵌套。现在这只是一个<div id="inhalt">,而我有多个<div> 元素。每个类的结构保持不变。
这就是我所做的:
XDocument xtocdoc = XDocument.Load("epubv3TOC.xml");
XNamespace xtocNamespace = xtocdoc.Root.GetDefaultNamespace();
int navPointValue = 1;
int playOrdervalue = 1;
foreach (var value in breakslist)
{
var valueElements = value.Descendants(htmlNamespace + "p").ToList();
foreach (var values in valueElements)
if (values.Attribute("class") != null)
{
if (values.Attribute("class") != null && values.Attribute("class").Value.Contains("ch"))
{
xtocdoc.Descendants(xtocNamespace + "navMap").FirstOrDefault(de => de != null)
.Add(new XElement(xtocNamespace + "navPoint", new XAttribute("id", "navPoint-" + navPointValue)
, new XAttribute("playOrder", playOrdervalue)
, new XElement(xtocNamespace + "navLabel"
, new XElement(xtocNamespace + "text", "ch"))));
continue;
}
else if (values.Attribute("class") != null && values.Attribute("class").Value.Contains("h1"))
{
xtocdoc.Descendants(xtocNamespace + "navMap").FirstOrDefault(de => de != null)
.Elements(xtocNamespace + "navPoint")
.FirstOrDefault(el => el != null)
.Add(new XElement(xtocNamespace + "navPoint", new XAttribute("id", "navPoint-" + navPointValue)
, new XAttribute("playOrder", playOrdervalue)
, new XElement(xtocNamespace + "navLabel"
, new XElement(xtocNamespace + "text", "h1"))));
continue;
}
else if (values.Attribute("class") != null && values.Attribute("class").Value.Contains("h2"))
{
xtocdoc.Descendants(xtocNamespace + "navMap").FirstOrDefault(de => de != null)
.Elements(xtocNamespace + "navPoint")
.FirstOrDefault(el => el != null)
.Add(new XElement(xtocNamespace + "navPoint", new XAttribute("id", "navPoint-" + navPointValue)
, new XAttribute("playOrder", playOrdervalue)
, new XElement(xtocNamespace + "navLabel"
, new XElement(xtocNamespace + "text", "h2"))));
continue;
}
}
}
【问题讨论】:
-
澄清一下,这是您当前的输入,是吗?您能否在问题中包含您想要的输出?是否打算使用每个文本值的“4.3.1”(等)部分来确定嵌套?每个输入元素末尾的尾随“3.1”(等)部分怎么样?
-
是的,这是我当前的输入,我已经用我想要的输出更新了问题。忽略
playOrder和id属性。但是,如果您查看输出,则元素是嵌套的。基本上就是这样,所有的toc-h1都在toc-ch之下,而所有toc-h2都在toc-h1之下。 -
孙子值的处理方式与其他元素的处理方式不同(输出中添加了一个后缀,其他元素不存在)这一事实使这变得更加棘手。请您检查一下正是您所期望的输入和输出吗?
-
所以您想基于
class属性而不是文本值进行嵌套?如果您在问题中指定所有内容,而不仅仅是在 cmets 中,这将非常有帮助。 -
好的,有机会我会去看看,但很可能要到明天(英国时间)。 (如果您可以展示您已经尝试过的内容,那也会改进问题。)希望其他人能够在更短的时间内提供答案。