Primo Chalice Ответов: 1

Как удалить дочерние узлы, но при этом сохранить значение?


- Привет!

У меня есть элемент в моем XML следующим образом:

<p>This is a paragraph. < b >This is a bold tag.< /b > < b >This is another bold tag.< /b > < i >This is an italic tag.< /i ></p>.


Мой вывод должен быть таким:

<p>This is a paragraph. This is a bold tag. This is another bold tag. This is an italic tag.</p>


Результат, который я получаю:

<p>This is a paragraph.This is a bold tag.This is another bold tag.This is an italic tag.</p>


Все ценности внутри

теги объединяются, и пробел в конце тегов отсутствует.

Есть ли какой - нибудь способ удалить внутренние узлы и сохранить значения с пробелами? Или это есть способ предотвратить эту конкатенацию без пробелов?

Мне нужно, чтобы значения были такими, как они есть в основном XML.

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

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

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

XDocument xdoc = XDocument.Load("XMLFile.xml");
.
.
.
xdoc.Element("p").Value;


Я только что написал код, в котором получаю значение. Пожалуйста, скажите мне, какие изменения мне нужно внести здесь для значений, требуемых в вопросе.

BillWoodruff

вы рассматривали возможность использования регулярных выражений ?

Primo Chalice

- Привет!

Я использую XDocument и пытаюсь избежать регулярных выражений.

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

Richard MacCutchan

Все пробелы находятся вне каких-либо тегов, поэтому они будут проигнорированы читателем XML. Если вы хотите сохранить их, то вам нужно будет выполнить ручной синтаксический анализ (например, регулярное выражение).

1 Ответов

Рейтинг:
2

lmoelleb

Предполагая, что ваш ввод является допустимым XML (в отличие от приведенного вами примера), это можно сделать с помощью следующего кода:

XDocument doc = XDocument.Parse(
    "<p>This is a paragraph. <b>This is a bold tag.</b> <b>This is another bold tag.</b> <i>This is an italic tag.</i></p>",
    LoadOptions.PreserveWhitespace
);
		
string valueWithoutXmlElements = doc.Root.Value;
doc.Root.SetValue(valueWithoutXmlElements);
		
string valueWithRootXmlElement = doc.Root.ToString();
		
Console.WriteLine(valueWithRootXmlElement);


В частности, мне пришлось удалить пробелы внутри имен тегов (так что </b> Вместо < /b > и т. д.). Я также удалил конечную пунктуацию, так как XML не может содержать текст вне корневого узла. Если вам нужно поддерживать недопустимый XML, вы не сможете манипулировать им с помощью какой-либо вещи, используя правильный синтаксис XML (XmlReader, XDocument, XmlDocument,...), но вам придется делать регулярные выражения или что-то подобное, как уже предлагалось.

Главный трюк, который вы упустили, - это флаг:
LoadOptions.PreserveWhitespace
Это дает указание синтаксическому анализатору XML сохранять пробелы только в текстовых узлах (поэтому пробелы между тегами XML - элементов-пробелы в тексте и вокруг него-всегда сохраняются).

Обновление значения "с самим собой", а затем получение XML путем вызова ToString() действительно выглядит немного уродливо, но вы получите желаемый результат, не делая никаких манипуляций с узлами самостоятельно.

Я использую XDocument.Разбор, чтобы сохранить пример в одном файле - вы также можете указать LoadOptions при использовании XDocument.Load.


Maciej Los

5ed!