Bug 6304

Summary: Исследовать возможность загрузки в одно DOM-дерево нескольких XML-файлов с помощью libxml
Product: [Системы управления (Control Systems)] UniSet Reporter: Vitaly Lipatov <lav>
Component: mainAssignee: Vitaly Lipatov <lav>
Status: CLOSED FIXED QA Contact: Pavel Vainerman <pv>
Severity: minor    
Priority: P4 CC: pv, sin
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: All   
URL: http://xmlsoft.org/examples/index.html#reader4.c
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:

Description Vitaly Lipatov 2010-10-26 09:27:38 MSD
Для того, чтобы получить возможность использовать несколько XML-файлов, нужно
исследовать, как в одно DOM-дерево загрузить последовательно несколько XML-файлов с помощью libxml2.
Comment 1 Vitaly Lipatov 2010-12-17 03:01:50 MSK
Добавил поддержку вставки файлов:

commit 7ef28af3b6d2322cd724295c63a972b6f813fa1a
Author: Vitaly Lipatov <lav@etersoft.ru>
Date:   Fri Dec 17 02:56:46 2010 +0300

    UniXML: support for XInclude (see eterbug #6304)

diff --git a/src/Various/UniXML.cc b/src/Various/UniXML.cc
index efbf17a..c51a0ec 100644
--- a/src/Various/UniXML.cc
+++ b/src/Various/UniXML.cc
@@ -34,6 +34,7 @@
 #include "UniSetTypes.h"
 #include "UniXML.h"
 #include "Exceptions.h"
+#include <libxml/xinclude.h>
 
 using namespace UniSetTypes;
 using namespace std;
@@ -91,6 +92,12 @@ void UniXML::open(const string _filename)
        doc = xmlParseFile(_filename.c_str());
        if(doc == NULL)
                throw NameNotFound("UniXML(open): NotFound file="+_filename);
...
+       xmlXIncludeProcess(doc);
+
        cur = getFirstNode();
        filename = _filename;
 }


Использовать так:
<TAG xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="test2.xml"/>
</TAG>

Отсутствие файла будет проигнорировано, с предупреждением.
Comment 2 Pavel Vainerman 2010-12-17 10:33:53 MSK
(В ответ на comment #1)
> Добавил поддержку вставки файлов:
Эх... я не успел закомитить...
Comment 3 Pavel Vainerman 2010-12-21 23:39:58 MSK
На всякий запишу и сюда.
Если требуется вставить только часть файла, то записывается это так:

<xi:include href="test2.xml" parse="xml" xpointer="xpointer(/sensors/*)"/>

в данном случае из файла test2.xml
вставляется секция <sensors> (без корневых тегов!).