|
Как загрузить XML-строку в XMLFragment или XMLNode?
|
|||
---|---|---|---|
#18+
Здравствуйте, господа программисты! Подскажите пожалуйста, как можно загрузить произвольный (не считая отсутствия корня, правильно оформленный) xml-фрагмент в документ, DocumentFragment или Node? Вообще работаю с XML в Delphi, но нигде в интернете не нашел ответа на этот вопрос ни для одного языка. Не верится, что ни у кого не возникало такой задачи? Сейчас просто оборачиваю приходящую строку во временный тег и с помощью LoadXMLData получаю временный IXMLDocument, с которым и работаю. Но мне кажется, что должен быть более простой (и наверное правильный) путь. Что-то типа XMLDocfragment.Loadxml (как у документа). Буду благодарен за любые подсказки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 16:02 |
|
Как загрузить XML-строку в XMLFragment или XMLNode?
|
|||
---|---|---|---|
#18+
Согласно MSDN IXMLDOMDocumentFragment наследник от IXMLDOMNode. Следовательно узел корневой должен быть один. А вот если взять ISAXXMLReader и подсунуть ему входной IStream, то, по идее, он распарсит первый корневой узел и остановится. При этом позиция в IStream будет указывать на следующий узел. В общем мне кажется, что если задача и имеет решение, то только через SAX С уважением, Vasilisk ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2010, 23:07 |
|
Как загрузить XML-строку в XMLFragment или XMLNode?
|
|||
---|---|---|---|
#18+
_Vasilisk_, Вообще, насколько я себе это представляю, то, что IXMLDOMDocumentFragment наследник от IXMLDOMNode, вовсе не означает, что у него должен быть корневой элемент. Более того, по большому счету, в IXMLDOMNode тоже нет требования наличия одного корневого элемента, просто IXMLDOMNode - это и есть один узел (любой, не обязательно элемент). Такое требование предъявляется, по моему, только к документу. Кстати, согласно спецификации W3C : DOM level 2 CoreDocumentFragment is a "lightweight" or "minimal" Document object. It is very common to want to be able to extract a portion of a document's tree or to create a new fragment of a document... ... The children of a DocumentFragment node are zero or more nodes representing the tops of any sub-trees defining the structure of the document. DocumentFragment nodes do not need to be well-formed XML documents (although they do need to follow the rules imposed upon well-formed XML parsed entities, which can have multiple top nodes). Так что похоже для данной задачи DocumentFragment подходит как нельзя лучше... Но не будем зацикливаться на фрагментах. Более частная задача:как можно загрузить XML-строку в node? Например: получить сразу node (любой - IXMLDOMNode, IDOMNode, IXMLNode - неважно через какой интерфейс) имея строку '<root/>' не загружая ее в документ. По-моему вполне реальная задача. P.S.: Спасибо за предложенный вариант с SAX. Честно говоря с SAX практически не знаком, но разве он предназначен не только для чтения? А мне нужна возможность изменения и в конечном итоге нужен DOM. Но все равно спасибо - подумаю в этом направлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2010, 10:57 |
|
Как загрузить XML-строку в XMLFragment или XMLNode?
|
|||
---|---|---|---|
#18+
androzavrБолее того, по большому счету, в IXMLDOMNode тоже нет требования наличия одного корневого элемента, просто IXMLDOMNode - это и есть один узел (любой, не обязательно элемент)Либо я Вас не понял, либо Вы в этой фразе сами себе противоречите. Именно, что узел один. Это может быть любой из этих (а может и не любой). Быть может с потомками. Но это не список узлов. androzavrБолее частная задача:как можно загрузить XML-строку в node? Например: получить сразу node (любой - IXMLDOMNode, IDOMNode, IXMLNode - неважно через какой интерфейс) имея строку '<root/>' не загружая ее в документ.Глупый вопрос - зачем? Почему эту строку нельзя загрузить в документ? Кроме того каждый IXMLDOMNode имеет not null read only поле ownerDocument. Как, в свете этого, Вы собираетесь работать с обособленным IXMLDOMNode не привязанным ни к какому документу? androzavrP.S.: Спасибо за предложенный вариант с SAX. Честно говоря с SAX практически не знаком, но разве он предназначен не только для чтения? А мне нужна возможность изменения и в конечном итоге нужен DOM. Но все равно спасибо - подумаю в этом направлении.Идея была в том, чтобы в процессе чтения формировать DOM ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2010, 23:19 |
|
Как загрузить XML-строку в XMLFragment или XMLNode?
|
|||
---|---|---|---|
#18+
_Vasilisk_Именно, что узел один. Это может быть любой из этих (а может и не любой). Быть может с потомками. Но это не список узлов.А я и не говорил, что "это список узлов". Я имел ввиду наличие корневого ЭЛЕМЕНТА, т.к. видимо тоже не слишком внимательно прочел Ваше сообщение (каюсь...) и не заметил, что Вы в свою очередь говрили о корневом узле (в терминах DOM). Если же говорить о IXMLDOMDocumentFragment, то это действительно один узел, который может иметь потомков. Но сам он в некотором смысле "особенный", т.к. не имеет представления в виде XML, а его потомки имеют. Таким образом ему можно создать несколько потомком - элементов, которые в представлении XML (IXMLDOMDocumentFragment.xml) не будут иметь корневого элемента. Пример . Примерно это мне и надо получить, но не создавая по отдельности все дочерние узлы, а скормив парсеру xml-фрагмент (строку) получить объект IXMLDOMDocumentFragment. _Vasilisk_androzavrБолее частная задача:как можно загрузить XML-строку в node? Например: получить сразу node (любой - IXMLDOMNode, IDOMNode, IXMLNode - неважно через какой интерфейс) имея строку '<root/>' не загружая ее в документ.Глупый вопрос - зачем? Почему эту строку нельзя загрузить в документ?Пример неудачный. Пускай будет строка не '<root/>', а, например, '<node1/><node2/><node3><child1/></node3>' _Vasilisk_Кроме того каждый IXMLDOMNode имеет not null read only поле ownerDocument. Как, в свете этого, Вы собираетесь работать с обособленным IXMLDOMNode не привязанным ни к какому документу?А я и не собираюсь работать с обособленным IXMLDOMNode (в данном случае - с обособленным IXMLDOMDocumentFragment). У меня есть IXMLDOMDocument, от которого создан IXMLDOMDocumentFragment и вот в него мне нужно загрузить xml-строку, чтоб потом одним действием сделать все поддерево дочерним определенному элементу объекта IXMLDOMDocument. Сейчас же приходится создавать временный документ. Загружать в него строку, предварительно обернутую временным корневым тегом. А затем клонировать в основной документ все дочерние узлы корневого элемента временного документа. Вот как... _Vasilisk_Идея была в том, чтобы в процессе чтения формировать DOMЭто я и так уже понял... :) Правда до сих пор не добрался до того чтоб наконец попробовать SAX... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2010, 18:06 |
|
Как загрузить XML-строку в XMLFragment или XMLNode?
|
|||
---|---|---|---|
#18+
androzavrТаким образом ему можно создать несколько потомком - элементов, которые в представлении XML (IXMLDOMDocumentFragment.xml) не будут иметь корневого элемента. Пример Теперь все понял. Бардак! androzavrПравда до сих пор не добрался до того чтоб наконец попробовать SAX...Похоже это единственный выход. P.S. А чем не устраивает обрамление общим тегом и загрузка в IXMLDOMDocument? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2010, 22:40 |
|
Как загрузить XML-строку в XMLFragment или XMLNode?
|
|||
---|---|---|---|
#18+
_Vasilisk_androzavrПравда до сих пор не добрался до того чтоб наконец попробовать SAX...Похоже это единственный выход.Да, видимо настало время все-таки разбираться с SAX... _Vasilisk_P.S. А чем не устраивает обрамление общим тегом и загрузка в IXMLDOMDocument?Да в принципе сейчас у меня так все и работает. Просто я надеялся, что я где-то что-то упускаю из виду и на самом деле задача имеет красивое, элегантное решение (в две строчки)... Вообще я думал, что у парсера существует больше возможностей по разбору xml-строк, видимо ошибался. Ну, как я понимаю, тема закрыта. Подумаю еще в сторону SAX. _Vasilisk_, спасибо за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2010, 09:53 |
|
|
start [/forum/topic.php?fid=14&fpage=37&tid=1333313]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 133ms |
0 / 0 |