Подскажите пожалуйста, как можно задать тип xml документа: <!DOCTYPE yml_catalog SYSTEM "Yandex.xml">?
Я не могу найти инструкции по использовании данных методов. Может есть возможность подключить их в Excel?
Вот макрос (тоже с этого форума):
Скрытый текст
Код
Sub YML_For_Professional()
On Error Resume Next
xmlpath$ = ThisWorkbook.Path & "\Yandex-YML1251.xml"
Set XML = CreateObject("Microsoft.XMLDOM")
Dim ra As Range, cell As Range
Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp)) ' заполненные строки
' задаем кодировку для XML
XML.AppendChild XML.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'")
XML.Save xmlpath$
With XML.AppendChild(XML.createElement("pma_xml_export"))
.Attributes.setNamedItem(XML.createAttribute("version")).Text = "1.0"
XML.Save xmlpath$
With .AppendChild(XML.createElement("databas"))
.Attributes.setNamedItem(XML.createAttribute("name")).Text = "pachom"
XML.Save xmlpath$
' добавляем дочерние узлы для каждой строки
For Each cell In ra.Cells ' перебираем все строки
With .AppendChild(XML.createElement("table")) ' создаём узел в XML
XML.Save xmlpath$
' и добавляем в него значения
.Attributes.setNamedItem(XML.createAttribute("name")).Text = "mesp_phocagallery_categories_nev"
XML.Save xmlpath$
For i = 1 To 39 ' для каждого столбца
With .AppendChild(XML.createElement("column")) ' к элементу column
ColumnName$ = Cells(1, i) 'дописываем атрибут name
XML.Save xmlpath$
.Attributes.setNamedItem(XML.createAttribute("name")).Text = ColumnName$
XML.Save xmlpath$
.Text = cell.EntireRow.Cells(i) 'и присваиваем значение
XML.Save xmlpath$
End With
Next
End With
Next cell
End With
End With
XML.Save xmlpath$ ' сохраняем XML
End Sub
Если кто знает, подскажите также пожалуйста как создать структуру xml читабельной - с отступами и переходом на новые строчки
зачем? открываете созданных XML в браузере, - там видно будет всю структуру
PS: Узнаю свой макрос, но над ним кто-то основательно поработал, наляпав кучу лишних XML.Save xmlpath$ ...
По теме: вбил в яндекс запрос «XML как добавить doctype», и, о чудо, через 5 секунд нашел готовый код:
Код
Dim doc As New XmlDocument()
'Create a document type node and
'add it to the document.
Dim doctype As XmlDocumentType
doctype = doc.CreateDocumentType("book", Nothing, Nothing, "<!ELEMENT book ANY>")
doc.AppendChild(doctype)
неужели так сложно поискать?
ещё вариант: (даже проще)
Код
Private Sub Command1_Click()
Dim dom As DOMDocument30, dctype As IXMLDOMDocumentType
Set dom = New DOMDocument30
dom.loadXML "<?xml version=""1.0"" encoding=""UTF-8""?>" _
& "<?xml-stylesheet type=""text/xsl"" href=""show_book.xsl""?>" _
& "<!DOCTYPE Capability SYSTEM ""c:\obex-capability.dtd"">" _
& "<!--catalog last updated 2000-11-01-->" _
& "<Capability version=""1.0"" />"
End Sub
Да похоже, что Doctype вы не создадите в VBA. Первый пример, предложенный EducatedFool, для .NET Второй приводит к тому, что DOMDocument30 содержит пустое дерево. Попытка создать что-либо Set pNode = pDoc.createNode(10, "yml_catalog", ""), (10 - код doctype) приводит к ошибке. Остаётся только костыль. После записи созданного xml принудительно вставить требуемую строку
Код
Public Sub InsertDocType(ByVal FileName As String)
Dim fso As Object, pStream As Object, s As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set pStream = fso.OpenTextFile(FileName)
s = pStream.ReadAll: pStream.Close
Set pStream = fso.CreateTextFile(FileName)
pStream.Write Replace(s, "<?xml version=""1.0"" encoding=""UTF-8""?>", _
"<?xml version=""1.0"" encoding=""UTF-8""?><!DOCTYPE yml_catalog SYSTEM ""Yandex.xml"">", Compare:=vbTextCompare)
pStream.Close
End Sub