Primo Chalice Ответов: 3

Как удалить ненужные жесткие диски в XML C#?


- Привет!

У меня есть XML, который содержит различные &ЛТ;смелые> и <курсив> теги.

Я загружаю файл с помощью
Xdocument.Load(filename, LoadOptions.PreserveWhiteSpace)
, но после удаления тегов и записи их в другой файл все теги "жирный" и "курсив" заменяются на ("\n").

Например,

<text><bold>Text</bold><text>
является:
<text>
Text
</text>

<text><bold><italic>Text</bold></italic><text>
является:
<text>


Text

</text>

Я хочу, чтобы так и было.:
<text>Text</text>


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

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

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

Xdocument.Load(filename, LoadOptions.PreserveWhiteSpace)

3 Ответов

Рейтинг:
2

lmoelleb

Когда вы указываете LoadOptions.PreserveWhiteSpace во время загрузки не будет добавлено или удалено никаких пробелов, поэтому я не думаю, что проблема именно в этом.

Я думаю, что ваша проблема заключается в экономии.

Взгляните на это Перечисление SaveOptions (System.Xml.Linq) | Microsoft Docs[^].

Это необязательный параметр ВКЛ. XDocument.Save.
В частности вам понадобится DisableFormatting флаг для обеспечения того, чтобы писатель не вставлял незначительные пробелы.

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

Присутствуют ли дополнительные новые строки после загрузки? Если да, то вам нужно посмотреть, как правильно его загрузить.

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

Если они отсутствуют в элементе, когда вы вызываете save, то он добавляется save, и вам нужно посмотреть на флаги, которые вы передаете для сохранения.

Будьте осторожны с отладчиком в Visual Studio, он пытается "помочь" вам, иногда отображая новые строки в виде пробелов. Используйте "текстовый визуализатор", доступный, щелкнув небольшое выпадающее меню, показанное с увеличительным стеклом рядом со значением.

Скорее всего, использование этого флага-правильный подход в вашем случае. Но если вы несете ответственность за генерацию XML-файлов и хотите свести к минимуму другие инструменты, делающие подобные ошибки при обработке ваших файлов "вниз по линии", вам следует заглянуть в xml:space атрибут. Он говорит любому стандартному совместимому XML-писателю/загруженному, чтобы сохранить значительные пробелы как при загрузке, так и при сохранении без каких-либо дополнительных параметров. Укажите его в корневом элементе, если вы ленивы (и хотите сделать его менее вероятным, чтобы вы его где-то забыли), или в отдельных элементах, если вы хотите сохранить его "красивым", где он все еще может форматироваться как можно больше.


Рейтинг:
1

OriginalGriff

Вот что LoadOptions.PreserveWhitespace[^] делает - он сохраняет все незначительные пробелы во входном файле. А пробелы-это "'в начале или конце, или более одного "' в строке; новые строки '\n'; и табуляции '\t'

Удалите опцию, и она, вероятно, исчезнет. Если это не так, вам нужно очень внимательно посмотреть на ваш входной файл.


Primo Chalice

- Привет!

Что происходит, так это то, что когда я не даю этой опции, то теги типа <bold>Bold <italic>Italic объединяются, и мне нужны эти пробелы между ними.

Без LoadOptions - BoldItalic
С LoadOptions - жирный курсив-это то, что я хочу.

Мой основной XML имеет структуру типа <paragraph><bold> & lt;italic>текст идет сюда< /italic>< /bold> & lt; /paragraph & gt;. Это становится:

<абзац>
<жирный шрифт>
<курсив>текст идет сюда
< /italic> -- игнорируйте пробел
< /bold> -- игнорируйте пробел
&ЛТ; /п&ГТ; -- игнорировать пространство

Я думаю, что это проблема. Есть ли способ предотвратить это?

Я получаю один результат правильно, а другой ошибается.

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

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

OriginalGriff

Взгляните сюда: https://www.tutorialspoint.com/xml/xml_white_spaces.htm

Primo Chalice

- Привет!

Есть ли способ предотвратить переход дочерних узлов на следующую строку, то есть сохранить основную структуру XML?

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

OriginalGriff

Это не имеет большого смысла в изоляции - имейте в виду, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.

Primo Chalice

Да, извини. Я имел в виду, что, поскольку я использую XDocument.Load(), я думаю, что это реструктуризация XML-файла и отправка дочерних узлов ниже их соответствующих родительских узлов. Итак, я просто хотел узнать, есть ли способ загрузить XML-файл с помощью XDocument.Load() но без изменения исходного файла?

OriginalGriff

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

Рейтинг:
0

Maciej Los

Цитата:
является:
<text>


Text

</text>


Я хочу, чтобы так и было.:
<text>Text</text>


Ваша xml - структура-это именно то, что она есть, потому что...
Цитата:
после удаления тегов и записи их в другой файл, все <жирный> и <курсив> теги заменяются на ("\n").


Вывод: замените ненужные теги пустой строкой.