Primo Chalice Ответов: 1

Как очистить старые значения из XML-файла в C#?


- Привет!

Я пытаюсь создать несколько XMl-файлов, но когда создается новый файл, также добавляются значения из предыдущего XML. Я хочу, чтобы новые значения добавлялись каждый раз при создании нового XML-файла.

Основной 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>
<title>First Title</title>
<break name="1-1">
<heading><page num="1"/>First Heading</heading>
<bl>This is another text</bl>
<p>This is a paragraph</p>
</break>
</sec>
<sec>
<title>Second Title</title>
<break name="2-1">
<heading><page num="1"/>Second Heading</heading>
<bl>This is another text</bl>
<p>This is a paragraph</p>
</break>
</sec>
<sec>
<title>First Title</title>
<break name="3-1">
<heading><page num="1"/>Third Heading</heading>
<bl>This is another text</bl>
<p>This is a paragraph</p>
</break>
</sec>
<sec>
<title>Third Title</title>
<break name="4-1">
<heading><page num="1"/>Fourth Heading</heading>
<bl>This is another text</bl>
<p>This is a paragraph</p>
</break>
<break name="5-1">
<heading><page num="1"/>Fifth Heading</heading>
<bl>This is another text</bl>
<p>This is a paragraph</p>
</break>
</sec>
</body>
</repub>


Рассматривая это как мой XML, мой вывод должен быть:

section_01.xml -
<root>........
<division-id id="preview_1" class="sectionArticleBlockOdd1" />
<division-id id="preview_2" class="sectionArticleBlockOdd2" />
......</root>


section_02.xml -
<root>........
<division-id id="preview_3" class="sectionArticleBlockOdd3" />
......</root>


section_03.xml - 
<root>........
<division-id id="preview_4" class="sectionArticleBlockOdd4" />
<division-id id="preview_5" class="sectionArticleBlockOdd5" />
......</root>


Что я получаю:

section_01.xml -
<root>........
<division-id id="preview_1" class="sectionArticleBlockOdd1" />
<division-id id="preview_2" class="sectionArticleBlockOdd2" />
......</root>


section_02.xml -
<root>........
<division-id id="preview_1" class="sectionArticleBlockOdd1" />
<division-id id="preview_2" class="sectionArticleBlockOdd2" />
<division-id id="preview_3" class="sectionArticleBlockOdd3" />
......</root>


section_03.xml -
<root>........
<division-id id="preview_1" class="sectionArticleBlockOdd1" />
<division-id id="preview_2" class="sectionArticleBlockOdd2" />
<division-id id="preview_3" class="sectionArticleBlockOdd3" />
<division-id id="preview_4" class="sectionArticleBlockOdd4" />
<division-id id="preview_5" class="sectionArticleBlockOdd5" />
......</root>


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

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

var sectionlist = xdoc.Descendants("sec").GroupBy(b => b.Element("title").Value).Select(b => b).ToList(); // xdoc is the main XML
foreach (var uniquesections in sectionlist)
    {
        var sectionbreakcount = uniquesections.Descendants("break").ToList();
		xsecdoc.Root.Element(ns + "head").Element(ns + "title").Value = ""; //xsecdoc is the output XML that will be created for every section found
		xsecdoc.Root.Element(ns + "head").Element(ns + "title").Add(uniquesections.Key);
		xsecdoc.Root.Element(ns + "body").Descendants().FirstOrDefault(el => (string)el.Attribute("class") == "sectionName").Value = "";
		xsecdoc.Root.Element(ns + "body").Descendants().FirstOrDefault(el => (string)el.Attribute("class") == "sectionName").Add(uniquesections.Key);
        foreach(var article in sectionbreakcount)
            {
                articlecount++;
                xsecdoc.Root.Element(ns + "body").Add(new XElement(ns + "division-id", new XAttribute("id", "preview_" + articlecount, new XAttribute("class", "sectionArticleBlockOdd" + articlecount)));
            }
            File.WriteAllText(opsFolder + "\\" + "section_0" + (sectionloopcount++) + ".xml", XmlEncode(xsecdoc));
	}

Richard Deeming

File.WriteAllText(opsFolder + "\\" + "section_0" + (sectionloopcount++) + ".xml", XmlEncode(xsecdoc));

Нет необходимости писать свой собственный метод для сохранения XDocument в файл. Просто использовать то Save метод[^]:
xsecdoc.Save(opsFolder + "\\" + "section_0" + (sectionloopcount++) + ".xml");

1 Ответов

Рейтинг:
0

Graeme_Grant

GroupBy не требуется. На самом деле, здесь есть несколько проблем.

Когда вы незнакомы, не пытайтесь делать все сразу. Лучше всего разбить необходимые детали, а затем ужесточить код.

Что-то вроде этого...

// break out each section
foreach (var uniqueSection in xdoc.Descendants("sec"))
{
    // process Group here ...
    var title = uniqueSection.Element("title")?.Value;

    foreach (var sectionBreak in uniqueSection.Descendants("break"))
    {
        // process section
        var heading = sectionBreak.Element("heading")?.Value;
        var bl = sectionBreak.Element("bl")?.Value;
        var body = sectionBreak.Descendants("p").Select(x => x.Value);
    }
}

Теперь установите точку останова и шаг через код и проверьте, что правильные части выбираются на каждом шаге.

Как только вы знаете, что код тянет правильные части, теперь вы готовы записать их в отдельные файлы.