MSXML6 DOM ドキュメントを作成し、シリアル化中に空の要素をシリアル化する方法を制御したいと考えています。
<tag></tag>
<tag/>
この回答は C# のソリューションについて説明していますが、MSXML の ActiveX インターフェイスで可能なことを探しています。(VB6 または一部のスクリプト言語の場合)
これは非常に厄介ですが、MSXML ドキュメントで createElement メソッドを使用すると、(何らかの理由で)<tag />
形式にシリアル化する xml 要素が取得されるため、要素を置換することでこのように強制的にシリアル化できることがわかりました。同じ名前で作成する要素:
<!-- 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 />
逆に、 text プロパティを次のように設定することで、展開されていない要素を強制的に展開でき""
ます。
newElement.text = "";
これが役に立てば幸いです-これが本当に恐ろしいことであることは知っていますが、最初にこれを行う必要があるという事実はすでに十分に恐ろしいものであるため、この余分な恐ろしさは大きな違いをもたらさない可能性があります! :-p
必要な C# マジック機能を VB6 アプリに公開する COM ラッパーを作成するのは難しくありません。
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.
}
}
これまでにこれを行ったことがない場合、C# で COM オブジェクトを定義するのは奇妙に思えるかもしれませんが、それほど難しくはありません。