MSXML - информация о пространствах имен не сохраняется - PullRequest
2 голосов
/ 07 октября 2010

Я использую MSXML 6.0 для преобразования своего собственного XML в другой формат XML.Я не уверен, что, может быть, я просто не совсем понимаю, как работает MSXML, но я думаю, что заметил какое-то странное поведение с ним ....

Я добавляю пространства имен в свой XML-документ, используя setProperty метод, например

XmlDocument.setProperty('SelectionNamespaces',
' xmlns:ms=''http://mydomain.com/2010/MySchema''');

Затем я создаю XML, используя свой собственный сериализатор в памяти (не сохраняя на диск).После сериализации я загружаю файл XSLT и выполняю преобразование, используя transformNodeToObject например,

AppXmlDoc.transformNodeToObject(XslXmlDoc, AStreamForTransformedXml);

Проблема заключается в том, что преобразование работает, но в нем нет ни одного конкретного шаблона, соответствующего XPath.является.Я устранил все проблемы с самим файлом XSLT, запустив его с тестовыми данными через Visual Studio, и он работал как положено.Затем я предположил, что это, должно быть, проблема с кодировкой, поэтому я убедился, что все документы были прочитаны / записаны как UTF-8 .... все еще не повезло.

Вот пример того, чтоtransform выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="http://mydomain.com/2010/MySchema" exclude-result-prefixes="ms">
<xsl:template match="/">
<ARoot>      
  <head>
    <xsl:apply-templates select="ms:Element/ms:SubElement" />
  </head>
  <body>
    <xsl:apply-templates select="ms:Element/ms:DifferentSubElement" />
  </body>
</ARoot>

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

  1. Создать новый документ XML
  2. Установить информацию о пространстве имен с помощью setProperty
  3. Сериализация XML и сохранение на диск.
  4. Закрытие документа - дополнительный шаг
  5. Создание нового документа XML - дополнительный шаг
  6. Перезагрузить документ - дополнительный шаг
  7. Переустановить информацию о пространстве имен - дополнительный шаг
  8. Выполнить преобразование.

Похоже, MSXML в какой-то момент теряет информацию о пространстве имен.Что делает его еще более странным, это даже если вы сбрасываете информацию о пространстве имен (после сериализации) и пробуете преобразование, которое все равно не работает!Может показаться, что это сработает, только если я сохраню документ, закрою его, заново создаю новый XML-документ и снова загрузлю его (что, как следствие, мне нужно для сброса пространств имен).

У кого-то есть мысли / идеина этом?

1 Ответ

1 голос
/ 08 октября 2010

Свойство SelectionNamespace используется для XPath с методами selectNodes и selectSingleNode, а не для XSLT или других целей. Поэтому я не уверен, почему вы установили его и чем, по вашему мнению, это поможет, поскольку вы, похоже, не используете selectNodes или selectSingleNode. Чего вы хотите достичь с помощью MSXML 6? Если вы хотите создать некоторые документы MSXML DOM с элементами и / или атрибутами в пространствах имен, убедитесь, что вы используете createNode, поскольку это единственный метод, поддерживающий пространство имен в API MSXML.

...