Я получаю ответы от двух разных веб-сервисов в формате 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>
Спасибо Снупи и другим за помощь!