MSXML создает XML "заголовок" - PullRequest
3 голосов
/ 23 марта 2011

Я пытаюсь использовать MSXML в VB6 для создания 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 ]

3 голосов
/ 23 марта 2011

Посмотрите на этот похожий вопрос .

Вам нужно использовать MXXMLWriter60, вместо того, чтобы сохранить его напрямую. ... Увидеть IMXWriter для деталей.

2 голосов
/ 26 марта 2011

Здесь много шума из UTF-8, но метод 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.

1 голос
/ 23 марта 2011

Спасибо за ваш вклад, но, к сожалению, описанные методы применимы только к xml на платформе .NET.

(Но вы действительно указали мне правильное направление)

В 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);
}
1 голос
/ 23 марта 2011

Это называется "декларация".

На устройстве записи XML установите для свойства omitXMLDeclaration значение False и encoding значение "utf-8".

...