Есть ли способ контролировать, какие теги сворачиваются при сериализации с MSXML6? - PullRequest
3 голосов
/ 05 октября 2009

Я создаю документ MSXML6 DOM, и во время сериализации я хочу контролировать сериализацию пустых элементов:

  1. <tag></tag>

  2. <tag/>

Этот ответ описывает решение для C #, но я ищу что-то возможное с помощью интерфейса ActiveX MSXML. (Для VB6 или некоторых скриптовых языков)

Ответы [ 2 ]

2 голосов
/ 26 октября 2009

Это невероятно грязно, но я обнаружил, что если вы используете метод createElement в документе MSXML, вы получаете (по какой-то причине) элемент xml, который сортируется в формате <tag />, и поэтому вы можете принудительно заставить serailize как это, заменив их элементами, которые вы создаете с тем же именем:

<!-- Contents of c:\xml.xml -->
<xml>
    <element></element>
</xml>

В Javascript (но, надеюсь, его легко конвертировать в VbScript)

objXML = new ActiveXObject("MSXML2.DOMDocument.4.0");
objXML.load("c:\\xml.xml");

var xmlElement = objXML.childNodes[1];

var newElement = objXML.createElement(xmlElement.childNodes[0].tagName);
xmlElement.replaceChild(newElement, xmlElement.childNodes[0]);

И наоборот, вы можете принудительно развернуть нерасширенные элементы <tag />, установив для свойства текста значение "":

newElement.text = "";

Надеюсь, это поможет - я знаю, что это действительно ужасно, но есть вероятность, что вам нужно сделать это, во-первых, достаточно ужасно, так что эта дополнительная ужасность не будет иметь большого значения! : -Р

0 голосов
/ 12 октября 2009

Нетрудно создать оболочку COM, которая предоставляет вашему приложению VB6 необходимые магические возможности C #.

using Interop=System.Runtime.InteropServices;

namespace MyNamespace
{
    [Interop.GuidAttribute("...guid here...")]
    [Interop.ComVisible(true)]
    [Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)]
    public partial class MyXmlWrapper 
    {
        // expose methods in here that do the XML serialization the 
        // way you want to.  
    }
}

Если вы этого еще не сделали, определение COM-объектов в C # может показаться экзотикой, но это не так сложно.

...