Я получаю XML-документ от компании, и в нем есть встроенные вкладки, новые строки и другой ненужный мусор. Есть ли какой-то метод в структуре, который возьмет такую строку и удалит эти нежелательные символы? Некоторые скриншоты ниже, это не артефакты отладчика/визуализатора, поскольку они действительно вступают в игру, когда я делаю строки сравнения
Пример №1:
Пример №2:
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
имеет оскорбительные символы во всем
Это тривиальная задача для 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 вверх на одном шаге может быть более удобным.