以下是我的XML输入:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE repub SYSTEM "C:repubRepub_V1.dtd">
<?xml-stylesheet href="C:repubrepub.xsl" type="text/xsl"?>
<repub>
<head>
<title>xxx</title>
</head>
<body>
<sec name="1">
<title>First Title</title>
<break name="1-1"/>
<pps>This is Sparta</pps>
<h1>
<page num="1"/>First Heading
</h1>
<bl>This is another text</bl>
<fig>
<img src="images/img_1-1.jpg" alt=""/>
<fc>This is a caption</fc>
</fig>
<p>
<b>This</b> again is<b> a paragraph</b>
</p>
</sec>
<sec name="2">
<title>Second Title</title>
<break name="1-1"/>
<h1>
<page num="1"/>Second Heading
</h1>
<bl>This is another text</bl>
<fig>
<img src="images/img_2-1.jpg" alt=""/>
<fc>This is a caption</fc>
<cr>This is a credit</cr>
</fig>
<p>This is a paragraph</p>
</sec>
<sec name="3">
<title>First Title</title>
<break name="3-1"/>
<h1>
<page num="1"/>Third Heading
</h1>
<bl>This is another text</bl>
<fig>
<img src="images/img_3-1.jpg" alt=""/>
<fc>This is a caption</fc>
</fig>
<p>This is a paragraph</p>
</sec>
<sec name="4">
<title>Third Title</title>
<break name="4-1"/>
<h1>
<page num="1"/>Fourth Heading
</h1>
<bl>This is another text</bl>
<p>This is a paragraph</p>
<fig>
<img src="images/img_4-1.jpg" alt=""/>
<fc>This is a caption</fc>
<cr>This is a credit</cr>
</fig>
<break name="5-1"/>
<h1>
<page num="1"/>Fifth Heading
</h1>
<bl>This is another text</bl>
<fig>
<img src="images/img_5-1.jpg" alt=""/>
<fc>This is a caption</fc>
<cr>This is a credit</cr>
</fig>
<p>This is a paragraph</p>
</sec>
</body>
</repub>
我想显示具有重复值的<break>
标签。我已经实现了,我正在使用以下方法:
var breaknameduplicate = xdoc.Descendants("sec").Descendants("break")
.GroupBy(n => n.Attribute("name").Value.Trim()).ToList()
.Where(g => g.Count() > 1)
.Select(g => new { Name = g.Key, count = g.Count() })
.ToList();
string s = string.Join(Environment.NewLine, breaknameduplicate.Select(x => "<break name="" + x.Name + ""/> - " + x.count + " times."));
if (!String.IsNullOrEmpty(s))
{
MessageBox.Show(s);
}
现在,我想要的是我也想为<break>
展示<sec>
。
<break name="1-1"> - 2 times in sections 1 and 2.
目前,我只能显示一个值重复的次数,但我想更精确地显示输出。
请帮忙。
问候
您可以使用以下代码:
var xDoc = XDocument.Load(@"path to the file");
var grouped = xDoc.Descendants("sec")
.GroupBy(e => e.Descendants("break").First().Attribute("name").Value.Trim())
.Select(g => $"<break name = "{g.Key}"> - {g.Count()} time(s) in section(s) {string.Join(",", g.Select(e => e.Attribute("name").Value))}")
.ToList();
获得sec
的幼稚方法
var breaknameduplicate = xdoc.Descendants("sec").Descendants("break")
.GroupBy(n => n.Attribute("name").Value.Trim()).ToList()
.Where(g => g.Count() > 1)
.Select(g => new { Name = g.Key, count = g.Count(), Sections = g.Select(e => e.Ancestors("sec").FirstOrDefault()).ToList() })
.ToList();
编辑:要获取标题:
var breaknameduplicate = xdoc.Descendants("sec").Descendants("break")
.GroupBy(n => n.Attribute("name").Value.Trim()).ToList()
.Where(g => g.Count() > 1)
.Select(g => new { Name = g.Key, count = g.Count(),
Sections = g.Select(e => e.Ancestors("sec")
?.Elements("title")
?.FirstOrDefault()
?.Value)
.ToList()
})
.ToList();