Primo Chalice Ответов: 1

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


Мой 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 3.1</p>
    <p class="toc-h2">4.3.2 Grand-child Value 3.2</p>
    <p class="toc-h2">4.3.3 Grand-child Value 3.3</p>
    <p class="toc-h2">4.3.4 Grand-child Value 3.4</p>
    <p class="toc-h1">4.4 Child Value 4</p>
    <p class="toc-h2">4.4.1 Grand-child Value 4.1</p>
    <p class="toc-h2">4.4.2 Grand-child Value 4.2</p>
    <p class="toc-h2">4.4.3 Grand-child Value 4.3</p>
    <p class="toc-h2">4.4.4 Grand-child Value 4.4</p>
    <p class="toc-h1">4.5 Child Value 5</p>
    </div>
    </body>
    </html>


Вот чего я хочу:

<?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>
    <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 3.1</text></navLabel></navPoint>
    <navPoint id="navPoint-06" playOrder="06"><navLabel><text>4.3.2 Grand-child Value 3.2</text></navLabel></navPoint>
    <navPoint id="navPoint-07" playOrder="07"><navLabel><text>4.3.3 Grand-child Value 3.3</text></navLabel></navPoint>
    <navPoint id="navPoint-08" playOrder="08"><navLabel><text>4.3.4 Grand-child Value 3.4</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 4.1</text></navLabel></navPoint>
    <navPoint id="navPoint-11" playOrder="11"><navLabel><text>4.4.2 Grand-child Value 4.2</text></navLabel></navPoint>
    <navPoint id="navPoint-12" playOrder="12"><navLabel><text>4.4.3 Grand-child Value 4.3</text></navLabel></navPoint>
    <navPoint id="navPoint-13" playOrder="13"><navLabel><text>4.4.4 Grand-child Value 4.4</text></navLabel></navPoint></navPoint>
    <navPoint id="navPoint-14" playOrder="14"><navLabel><text>4.5 Child Value 5</text></navLabel></navPoint></navPoint>
    </navMap>
    </html>


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

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

Это то, что я пробовал:

var navPoint = new XElement(ePUBv3TOCNamespace + "navPoint"
    , new XAttribute("id", "navPoint-" + navPointcounter)
    , new XAttribute("playOrder", playOrder)
    , new XElement(ePUBv3TOCNamespace + "navLabel"
    , new XElement(ePUBv3TOCNamespace + "text", fileWithoutExtension)));
    var navContent = new XElement(ePUBv3TOCNamespace + "content", new XAttribute("src", "Text/" + fullFileName));
    xtabdoc.Root.Element(ePUBv3TOCNamespace + "navMap").Add(navPoint);
    navPoint.Add(navContent);
    navPointcounter++;
    playOrder++;

1 Ответов

Рейтинг:
2

Christian Graus

Вы добавляете дочерний узел к узлу, который будет его родителем. Сначала получите элемент в своем коде и подтвердите, что вы получили правильный элемент для отладки, Когда будете работать над ним


Primo Chalice

Не могли бы вы мне помочь? Я не могу продолжать, поэтому я попросил о помощи. Я не знаю, как сделать следующий шаг.

Christian Graus

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/how-to-find-descendants-with-a-specific-element-name

Как только вы найдете свой узел, у него есть метод Add, который добавляет дочерний элемент