Primo Chalice Ответов: 1

Как прочитать повторяющиеся значения в каждом родительском элементе в XML C#?


- Привет!

Мой XML выглядит следующим образом (формат):
<!DOCTYPE repub SYSTEM "C:\repub\Repub_V1.dtd">
<?xml-stylesheet href="C:\repub\repub.xsl" type="text/xsl"?>
<repub>
<head>
<title>Default Title</title>
</head>
<body>
<sec>
<title>TITLE</title>
<break name="1-1">
<p>Text 1</p>
<heading><page num ="1"/>Heading</heading>
<subheading>Subheading</subheading>
<fig><img src="images/img_1-1.jpg" alt=""/><fc>Image Caption</fc><cr>Image Credit</cr></fig>
<fig><img src="images/img_1-2.jpg" alt=""/><fc>Image Caption</fc></fig>
<fig><img src="images/img_1-3.jpg" alt=""/><fc>Image Caption</fc><cr>Image Credit</cr></fig>
</break>

<break name="2-1">
<p>Text 2</p>
<heading><page num ="2"/>Heading 2</heading>
<subheading>Subheading 2</subheading>
<fig><img src="images/img_2-1.jpg" alt=""/><fc>Image Caption</fc><cr>Image Credit 2</cr></fig>
<fig><img src="images/img_2-2.jpg" alt=""/></fig>
<fig><img src="images/img_2-3.jpg" alt=""/><fc>Image Caption</fc><cr>Image Credit</cr></fig>
</break>
</sec>
</body>
</repub>


Я хочу получить значение имени разрыва в качестве выходного, так как этот разрыв имеет дубликат значения <cr>.

Я этого не понимаю.

Пожалуйста помочь.

С уважением
Аман

Что я уже пробовал:

// xdoc is the XDocument that contains the main XML with the mentioned structure
var creditvalueduplicate = xdoc.Descendants("break").SelectMany(br => br.Descendants("cr").Select(p => new
{
	crd = br.Value.ToString(),
}))
.GroupBy(x => new { x.crd })
.Select(grp => new
{
	id = grp.Key,
	count = grp.Count()
}).ToList().Where(x => x.count > 1)
.ToList();

string s = string.Join("|", creditvalueduplicate.Select(x => "<cr>" + x.id +" - " + x.count + " times."));

if (!String.IsNullOrEmpty(s))
{
	AddMsg(s);
}

1 Ответов

Рейтинг:
2

Primo Chalice

Есть решение проблемы:

var creditduplicate = xdoc.Descendants("break").SelectMany(br => br.Descendants("cr").Select(p => new
{
	brk = br.Attribute("name").Value.ToString(),
	crd = p.Value.ToString()
}))
.GroupBy(x => new { x.brk, x.crd })
.Select(grp => new
{
	id = grp.Key,
	count = grp.Count()
}).ToList()
.Where(x => x.count > 1)
.ToList();


Maciej Los

5ed!