Удаление непечатаемых символов из текста XML (или любой строки)

1

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

Пример №1:

Изображение 174551

Пример №2:

Изображение 174551

FWIW эти XML-документы поступают из UTF8, кодирующего ответ на веб-запрос.

EDIT 2014-09-03 20:20 IST

В ответ на комментарии ниже от @CodeCaster я загружаю значения (в форме NameValueCollection), используя экземпляр WebClient. response возвращается ко мне, и я делаю следующее:

string reply = System.Text.Encoding.UTF8.GetString(response);
XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(new NameTable());
xmlNamespaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(reply);

Именно этот xmlDocument имеет оскорбительные символы во всем

  • 0
    System.String.Replace () кажется хорошим выбором.
  • 2
    «Я получаю документ XML» - пожалуйста, покажите этот код. - @Да нет, не совсем, непечатные символы могут быть законными в определенных местах.
Показать ещё 8 комментариев
Теги:

1 ответ

5
Лучший ответ

Это тривиальная задача для XSLT.

Эта таблица стилей XSLT нормализует (удаляет лишние пробелы) всех текстовых узлов из входного документа XML, оставляя все остальное нетронутым.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select="normalize-space()" />
  </xsl:template>

</xsl:stylesheet>

Используйте класс XslCompiledTransform чтобы применить его к входному XML.


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

Если вы сомневаетесь, примените выражение соответствия (<xsl:template match="text()">) к чему-то более конкретному (например, <xsl:template match="message//text()"> или <xsl:template match="status/text()">) влияет только на те текстовые узлы, которые вы действительно хотите выправить.


Конечно, вы можете добиться такого же эффекта, применив регулярное выражение к строящемуся значению после того, как вы извлекли его из документа:

return Regex.Replace(value, @"\s+", " ").Trim();

Использование XSLT для очистки входного XML вверх на одном шаге может быть более удобным.

  • 0
    Я прошу прощения за задержку в принятии этого, но я решил взломать эту проблему. При повторном рассмотрении я использовал суть идеи в этом действительно великолепном ответе. Спасибо за потраченное время, чтобы написать это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню