C #: Как отсортировать и сделать отступ перед XML перед сохранением? - PullRequest
2 голосов
/ 24 июня 2011

Я получаю ответы от двух разных веб-сервисов в формате XML. Оба веб-сервиса имеют одинаковую логику, но разработаны в разных технологиях. Мы переводим наши веб-сервисы на технологии Microsoft. Ядро веб-службы - это ядро, которое связано со многими другими приложениями и предоставляет им различные услуги.

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

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

Есть ли способ сортировки и отступа? XML перед сохранением (XMLDocument.Save) это?

Спасибо.


Решение:

Я нашел какой-то XSLT, который делает это в сети, но, похоже, проблема, когда элементы имеют атрибуты.

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

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

одно решение таково:

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

Но поскольку относительный порядок вывода атрибутов после сериализации результирующего дерева зависит от процессора, вы можете также пропустить сортировку атрибутов:

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

Спасибо Снупи и другим за помощь!

Ответы [ 4 ]

3 голосов
/ 24 июня 2011

Я рекомендую xmlunit для сравнения файлов, это расширение nunit написано на c # и бесплатно. http://xmlunit.sourceforge.net/

или сделайте это так, если вы предпочитаете ручное сравнение:

XmlDocument doc = new XmlDocument();
doc.LoadXml("bla");
XmlTextWriter writer = new XmlTextWriter("data.xml",null);
writer.Formatting = Formatting.Indented;
doc.Save(writer);
0 голосов
/ 24 июня 2011

Если он отличается от того, что вы хотите, и вы беспокоитесь только о контенте, который он сам , например, проверяя, правильно ли установлены заголовки, если вы пропустили какой-либо узел ...

Я бы настоятельно рекомендовал ПРЕКРАТИТЬ видеть различия ВРУЧНУЮ !

Я бы создал простое приложение (windows / web), которое считывало бы эти 2 папки и использовало каждуюимя файла (давайте представим, что это одно и то же имя) и создадим графическое представление каждого узла и свойств и Assert, учитывая, что все находится в правильном месте.

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

  • Открыть файлы (используя FileSystemWatcher, чтобы не делать вещи вручную)
  • Разобрать их (разобрать их в пользовательские объекты и загрузить как простые XMLNodeList)
  • сравнитьих (для каждого узла в исходном (старом сервисном) файле есть ли новый файл сервиса?)
0 голосов
/ 24 июня 2011

Я бы предложил запустить оба XmlDocuments через один и тот же Xslt (выполнить сортировку и отступ).Полученные XmlDocuments должны легко сравниваться (вручную) с выбранным вами инструментом.

0 голосов
/ 24 июня 2011

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

Посмотрите на инструменты XML Diff, такие как Altova, здесь: http://www.altova.com/downloadtrialdiffdog.html?gclid=CM-c8ayEzqkCFcNP4Qod4DTKMw

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...