|
|
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Как бы сделать вот такой финт ушами: XML1: <node1 attr1="foo" /> XML2: <node1 attr2="bar"> <subnode /> </node1> Нужно получить их сумму: <node1 attr1="foo" attr2="bar"> <subnode /> </node1> Вижу 2 пути решения задачи: 1. Манипуляции с DOM, SimpleXML и иже с ними (преобразование в массивы, их merge-ние) и т. п. (требуемый язык — PHP). 2. Универсальное решение на XSLT. Исходные XML объединяем в один: <root> <xml1> <node1 attr1="foo" /> </xml1> <xml2> <node1 attr2="bar"> <subnode /> </node1> </xml2> </root> и пишем какой-то хитровывернутый XSLT-шаблон, который это преобразует в то что требуется. Может кто-то уже решал эту задачу одним из этих, или может ещё каким путём? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 12:31 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Напишу основную идею, время будет допишу полностью. Примерно так Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 12:56 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Замечания по своему коду. 1.Он оказался не очень универсальным. Если в исходном элементе более чем один атрибут, то прога проста загнется. 2.Чтобы вывести вложенные теги вместо: Код: plaintext Код: plaintext Подожди может кто еще напишет :) А я еще подумаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 13:30 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Greendrake 2. Универсальное решение на XSLT. Исходные XML объединяем в один: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 15:26 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 15:27 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Имелось ввиду универсальное решение, не привязанное к конкретному XML, node1 и т. п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 15:37 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
насколько универсальное и насколько не привязанное? Поподробнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 17:09 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
maXmoнасколько универсальное и насколько не привязанное? Поподробнее. Ну то есть чтобы можно было взять два любых XML-файла и смержить их. Если у них вообще нет ничего общего, то должен получиться файл-склейка из двух (ну, может в котором их содержимое объединено под одним корневым контейнером для валидности). Если у них есть одноимённые ноды, то они мержатся, как в примере выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 18:03 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Greendrake maXmoнасколько универсальное и насколько не привязанное? Поподробнее. Ну то есть чтобы можно было взять два любых XML-файла и смержить их. Если у них вообще нет ничего общего, то должен получиться файл-склейка из двух (ну, может в котором их содержимое объединено под одним корневым контейнером для валидности). Если у них есть одноимённые ноды, то они мержатся, как в примере выше. FULL OUTER JOIN двух произвольных xml-ей ? ;-)) Тогда наверное брать за основу то что писал SuSa только есессно с полным обходом + он забыл про содержимое 2го которое никак не пересекается с первым, т.е. "Обходим рекурсивно первое дерево, полностью копируем его в результат + на каждом уровне добавляем то что есть во втором, но нет в первом". Кстати возможно вам проще это будет написать на (в вашем случае) PHP, манипулируя двумя DOM-ами. К тому же и понятнее, если не сталкивались раньше с XSLT ;-) ЗЫ простота дальнейшего сопровождения и развития созданного продукта - великое дело :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2007, 10:56 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
Решил всё-же идти по пути XSLT. В принципе получилось, но с некоторыми нюансами: 1. Входящие XML не равноценны. Один используется как master, второй как slave. Принцип действия таков, что обходятся все ноды мастера, и если у слэйва есть соответствующая нода, и в ней есть дополнительные атрибуты — они добавляются в результирующее дерево. При этом, если нода слэйва содержит потомков, которых у мастера нет, они копируются целиком. 2. Шаблон хорошо работает только для исходных XML без повторяющихся на одном и том же уровне нод. Если ноды на одном уровне будут повторяться, то результат неудовлетворителен. Были попытки решить эту проблему путём запоминания ID нод (функция generate-id()), но пока они не увенчались успехом. <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output encoding="UTF-8" indent="yes" method="xml" /> <xsl:template match="root"> <xsl:variable name="n1" select="document('m1.xml')" /> <xsl:variable name="n2" select="document('m2.xml')" /> <root> <xsl:for-each select="$n1/*"> <xsl:variable name="n" select="local-name()" /> <xsl:apply-templates select="."> <xsl:with-param name="n2" select="$n2/*[local-name()=$n]" /> </xsl:apply-templates> </xsl:for-each> </root> </xsl:template> <xsl:template match="*|@*"> <xsl:param name="n2" /> <xsl:variable name="n1" select="." /> <xsl:copy select="."> <xsl:apply-templates select="@*" /> <xsl:apply-templates select="$n2/@*" /> <xsl:for-each select="*"> <xsl:variable name="n" select="local-name()" /> <xsl:choose> <xsl:when test="$n2 and $n2/*[local-name()=$n]"> <xsl:apply-templates select="."> <xsl:with-param name="n2" select="$n2/*[local-name()=$n]" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:copy-of select="." /> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:for-each select="$n2/*"> <xsl:variable name="n" select="local-name()" /> <xsl:if test="not($n1/*[local-name()=$n])"> <xsl:copy-of select="." /> </xsl:if> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 13:04 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
чувствую, можно изратиться, но это будет нетривиально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 19:34 |
|
||
|
Наложение (merge) DOM/XML друг на друга
|
|||
|---|---|---|---|
|
#18+
вот, извратился, вроде пашет :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 20:02 |
|
||
|
|

start [/forum/moderation_log.php?user_name=%D0%BD%D0%B5+%D0%B2%D0%B0%D1%81%D1%8F]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 442ms |
| total: | 617ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...