以下是我的XML输入:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE repub SYSTEM "C:\repub\Repub_V1.dtd">
<?xml-stylesheet href="C:\repub\repub.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);
}
现在,我要显示的是<sec>
也要显示<break>
。
<break name="1-1"> - 2 times in sections 1 and 2.
目前,我只能显示重复值的次数,但我希望输出结果更加精确。
请帮助。
致谢
答案 0 :(得分:0)
您可以使用以下代码:
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();
答案 1 :(得分:0)
获取sec
s的幼稚方法
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();