我试图在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:如何创建未终止的“标题”值?
答案 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);
}