MSXML创建XML“标题”

时间:2011-03-23 00:51:40

标签: c# xml vb6 xml-serialization msxml

我试图在VB6中使用MSXML来创建一个XML文件,然后可以将其反序列化为C#中的对象。

我试图模仿的XML看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfStock xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Stock>
    <ProductCode>12345</ProductCode>
    <ProductPrice>10.32</ProductPrice>
  </Stock>
  <Stock>
    <ProductCode>45632</ProductCode>
    <ProductPrice>5.43</ProductPrice>
  </Stock>
</ArrayOfStock>

我的问题是如何使用MSXML库创建以下行?

<?xml version="1.0" encoding="utf-8"?>

IE:如何创建未终止的“标题”值?

4 个答案:

答案 0 :(得分:3)

看看这个similar question

  

您需要使用MXXMLWriter60,   而不是直接保存它。 ......见   IMXWriter了解详情。

答案 1 :(得分:2)

这里有很多关于UTF-8的hubbub,但DOMDocument.save()方法确实使用PI来确定如何编码已保存的输出。唯一真正的障碍是,对于格式化输出而不是经济输出(没有空格),您需要使用SAX Writer。

基本上事情似乎与预期一样有效。没有什么可以解决的问题,它是如何完成的。

Option Explicit

Private Sub Main()
    Dim varStock As Variant
    Dim docStock As MSXML2.DOMDocument
    Dim elemRoot As MSXML2.IXMLDOMElement
    Dim elemStock As MSXML2.IXMLDOMElement
    Dim elemField As MSXML2.IXMLDOMElement
    Dim I As Integer

    varStock = Array(Array("12345", 10.32), _
                     Array("¥45632", 5.43)) 'Yen sign used here to show Unicode.

    Set docStock = New MSXML2.DOMDocument
    With docStock
        .appendChild .createProcessingInstruction("xml", _
                                                  "version=""1.0"" encoding=""utf-8""")
        Set elemRoot = .createElement("ArrayOfStock")
        With elemRoot
            .setAttribute "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"
            .setAttribute "xmlns:xsd", "http://www.w3.org/2001/XMLSchema"
            For I = 0 To UBound(varStock)
                Set elemStock = docStock.createElement("Stock")
                With elemStock
                    Set elemField = docStock.createElement("ProductCode")
                    elemField.Text = CStr(varStock(I)(0))
                    .appendChild elemField
                    Set elemField = docStock.createElement("ProductPrice")
                    elemField.Text = CStr(varStock(I)(1))
                    .appendChild elemField
                End With
                .appendChild elemStock
            Next
        End With
        Set .documentElement = elemRoot
        On Error Resume Next
        Kill "created.xml"
        On Error GoTo 0
        .save "created.xml"
    End With
End Sub

检查输出文件以查找日元符号,您应该看到文本是UTF-8编码。

如果你想要内存而不是磁盘你可以.save()到类似ADODB.Stream对象的东西,或者只使用XMLHTTPRequest.send和DOMDocument作为参数(正文)。没有必要采用Interop方法的重量级选项。

答案 2 :(得分:1)

它被称为“宣言”。

在XML编写器上,将属性omitXMLDeclaration设置为False,将encoding设置为"utf-8"

答案 3 :(得分:1)

感谢您的输入,但不幸的是,所描述的方法仅适用于.NET平台中的xml。

(但你确实指导我朝正确的方向发展)

在VB6(使用MSXML 3及更高版本)中,实现我所寻找的方法是createProcessingInstruction()

代码看起来像这样。

Private Sub BuildHeader()
    m_document.appendChild m_document.createProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
End Sub

然后可以这样处理(假设所有其他对象的细节都是一致的)

XmlSerializer serializer = new XmlSerializer(typeof(Stock));
using (StreamReader streamReader = new StreamReader(path))
{
    return (Stock)serializer.Deserialize(streamReader);
}