O$>>Можно ли заставить MSXML парсер сохранять документы в структурированном виде? У меня шарошит весь файл в одну строку
S>Не раз уже такой вопрос возникал — и ни разу я ответа не видел . Нельзя вроде бы это сделать с помощью парсера... Ручками надобно чего-нить дописывать...
X> wcstombs(sXML.GetBuffer(0),bstrXML,bstrXML.length());
X> mbstowcs(bstrXML,sXML,sXML.GetLength());
X>И этот код не работает в той части где должно происходить разбиение на строки описанным выше сособом. ПРичем не работает именно функция Replace, замены символов не происходит. В чем ошибка??
Попробуйте заменить:
wcstombs(sXML.GetBuffer(0),bstrXML,bstrXML.length());
на
sXML = (const char*)bstrXML;
и
mbstowcs(bstrXML,sXML,sXML.GetLength());
на
bstrXML = (LPCTSTR)sXML;
это работает, но то, что 100% правильно, не уверен.
O$>>Можно ли заставить MSXML парсер сохранять документы в структурированном виде? У меня шарошит весь файл в одну строку
I>Прю... I>Покопай в сторону I>IXMLDOMDocument::preserveWhiteSpace — по моему, это то что доухтор прописал.
дохтур, лекарство не действует как лепилось все в одну строку, так и лепится
O$>Можно ли заставить MSXML парсер сохранять документы в структурированном виде? У меня шарошит весь файл в одну строку
Не раз уже такой вопрос возникал — и ни разу я ответа не видел . Нельзя вроде бы это сделать с помощью парсера... Ручками надобно чего-нить дописывать...
Здравствуйте Slayer, Вы писали:
S>Не раз уже такой вопрос возникал — и ни разу я ответа не видел . Нельзя вроде бы это сделать с помощью парсера... Ручками надобно чего-нить дописывать...
Либо можно еще в сторону XSLT посмотреть, но в XSLT я тебе к сожаленью не советчик
Private Sub InsertNewlines(el_ As Object)
Dim par_ As Object
Set doc_=el_.OwnerDocument
Set par_=el_.ParentNode
' Break after every opening tagIf el_.HasChildNodes Then
If el_.ChildNodes.Item(0).NodeType<>3 Then' 3 - TEXT_NODESet o=el_.InsertBefore(doc_.CreateTextNode(Chr$(13)+Chr$(10)),el_.ChildNodes.Item(0))
End If
End If' Break after every closing tagIf el_.NodeType<>3 And par_.NodeType<>9 Then' 9 - DOCUMENT_NODEIf el_.NextSibling Is Not Nothing Then
Set o=par_.InsertBefore(doc_.CreateTextNode(Chr$(13)+Chr$(10)),el_.NextSibling)
Else
Set o=par_.AppendChild(doc_.CreateTextNode(Chr$(13)+Chr$(10)))
End If
End If' RecursionFor i=el_.ChildNodes.Length-1 To 0 Step -1
Call InsertNewLines(el_.ChildNodes.item(i))
Next i
End Sub
Public Sub SaveNiceXml(doc_ As Object,filename As String)
Call InsertNewlines(doc_.DocumentElement)
z%=doc_.save(filename)
z%=doc_.load(filename)
z%=doc_.save(filename)
End Sub
Sub Main
Dim doc_ As Object
Set doc_ = CreateObject("Microsoft.XMLDOM")
z%=doc_.load("D:\Temp\xml\sm.xml")
Call SaveNiceXml(doc_,"D:\Temp\xml\sm2.xml")
End Sub
Правда это на Rational Rose basic'е, но он почти VB
O$>>а можно по подробнее? "эта дрянь" не только убирает encoding="WINDOWS-1251", но корежит русские буквы при сохранении
AA>После того, как сделал загрузку из строки через loadXML, смотришь, есть ли processing instruction, если есть то заменяешь его своим, ну что-то типа:
OK, всё работает, после восстановления encoding="WINDOWS-1251", русские буквы при save() уже не корёжит.
Здравствуйте alsun, Вы писали:
A><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> A> <xsl:output indent="yes"/> A> ...
A>у меня работает...
А не мог бы ты поподробнее объяснить, куда эти stylesheets пихать, неужели прямо в xml-файл, который нужно структурировать? Я так понимаю, надо свой xml через трансформатор пропустить или я неправ?
И этот код не работает в той части где должно происходить разбиение на строки описанным выше сособом. ПРичем не работает именно функция Replace, замены символов не происходит. В чем ошибка??
Здравствуйте Xenia, Вы писали:
X>И этот код не работает в той части где должно происходить разбиение на строки описанным выше сособом. ПРичем не работает именно функция Replace, замены символов не происходит. В чем ошибка??
А по какому признаку Вы определили, что не происходит замены символов?
Если потому что их нет в "res.xml", то их там и не должно быть. Попробуйте саму строку bstrXML записать в файл и посмотрите, что получится. Может будет то, что Вам надо.
Здравствуйте Lloyd, Вы писали:
L>Здравствуйте Xenia, Вы писали:
X>>И этот код не работает в той части где должно происходить разбиение на строки описанным выше сособом. ПРичем не работает именно функция Replace, замены символов не происходит. В чем ошибка??
L>А по какому признаку Вы определили, что не происходит замены символов?
L>Если потому что их нет в "res.xml", то их там и не должно быть. Попробуйте саму строку bstrXML записать в файл и посмотрите, что получится. Может будет то, что Вам надо.
Здравствуйте Lloyd, Вы писали:
L>Здравствуйте Xenia, Вы писали:
X>>И этот код не работает в той части где должно происходить разбиение на строки описанным выше сособом. ПРичем не работает именно функция Replace, замены символов не происходит. В чем ошибка??
L>А по какому признаку Вы определили, что не происходит замены символов?
1. По возвращаемому функцией Replace значению
2. Файл как был в одну сроку так и остается
Ну вставлю и свои пять копеек.
Вот смотрю и диву даюсь, сколько народу мучается с тем чтобы нормально XML-ку сохранить.
Когда-то и я мучался.
Вот мой вариант, с использованием IMXWriter, который кстати позволяет сохранять данные в любой кодировке.
В примере ниже: сохраняется в строку в UTF-8 кодировке.