Как проанализировать дерево XML с DOMDocument? - PullRequest
2 голосов
/ 21 сентября 2009

Вот мой XML-файл:

<?xml version="1.0" encoding="utf-8"?>
 <root>
     <category>
         <name>Category</name>
         <desc>Category</desc>
         <category>
             <name>Subcategory</name>
             <desc>Sub-category</desc>
             <category>
                  <name>Subcategory</name>
                  <desc>Sub-category</desc>
             </category>  
         </category>  
     </category>
 </root>

Мое дерево может иметь как можно больше уровней. К этому нет требований.

Первый вопрос: Правильно ли мой XML для обработки такого рода требований? и как я могу оптимизировать его (если это необходимо)

Второй вопрос: Как я могу разобрать его с DOMDocument?

Я знаю, как загрузить документ XML, но я не знаю, как его проанализировать. Я немного читал о рекурсии, но не смог правильно понять, как отображать с помощью PHP / DOMDocument.

Спасибо за помощь!

EDIT

Что я хочу сделать, так это управлять системой категорий. Я пытался с SQL, но было слишком сложно управлять с помощью реляционной модели, даже с вложенным выбором, и т. Д ...

Так что я хочу иметь возможность сделать дерево из моего xml

как

  • Категория
    • Подкатегория
      • Подкатегория

Без ограничений по глубине

Я хочу иметь возможность искать категорию, извлекать все ее дочерние элементы (подкатегории) (или нет), ее родительские (ие) (или нет), (сестры?) И т. Д ...

Ответы [ 4 ]

1 голос
/ 21 сентября 2009

Если вы просто говорите о том, как обрабатывать такую ​​структуру - я бы сказал, напишите две функции, одну, которая принимает полную структуру, и одну, которая принимает ссылку на категорию DOMNode. Первая функция должна выполнить начальную обработку, а затем передать первую ссылку на начальный узел Category. Затем в этой функции вы обрабатываете свойства текущего узла по мере необходимости, а затем переходите в дочерние элементы, если они присутствуют.

Конечно, было бы более эффективно обрабатывать эту квартиру в одном цикле, но тогда вы потеряете буквальное представление иерархии.

1 голос
/ 21 сентября 2009

Что ж, нет ничего плохого в том XML, который вы здесь используете, но вы недостаточно говорите о том, что вы хотите сделать с данными, чтобы кто-нибудь дал вам качественный ответ о том, будет ли ваш XML захватывать то, что тебе нужно. Что касается «[разбора] с помощью DOMDocument», вы можете загрузить его в объект DOMDocument следующим образом:

$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
 <root>
     <category>
         <name>Category</name>
         <desc>Category</desc>
         <category>
             <name>Subcategory</name>
             <desc>Sub-category</desc>
             <category>
                  <name>Subcategory</name>
                  <desc>Sub-category</desc>
             </category>  
         </category>  
     </category>
 </root>
XML;
$d = new DOMDocument();
$d->loadXML($xml);

В этот момент снова возникает вопрос: что теперь вы хотите с этим делать?

0 голосов
/ 22 сентября 2009

Вы сказали, что пробовали SQL, и он не работает для вас. Просто совет: если вы используете Oracle, взгляните на START WITH ... CONNECT BY, если вы используете SQL Server, используйте рекурсивные CTE. Эти подходы решают проблему.

0 голосов
/ 21 сентября 2009

Подводя итог вышесказанному о том, что вы хотите с ним сделать ... ИМХО, есть три широких класса вещей, которые можно сделать с фрагментом XML.

Создав экземпляр DOMDocument и загрузив в него XML, вы можете искать его по узлам, используя запросы XPath, так же, как вы ищете по реляционной базе данных, используя запросы SQL SELECT. Вы можете извлечь свойства узла, подузлов узлов и текста внутри узлов. Какой вид разбора, я бы сказал. Компонент DOMDocument XPath сделает это за вас.

Вместо этого вы можете превратить ваш XML во что-то другое - другой диалект XML, XHTML и т. Д., Используя XSL-преобразования. Который может или не может быть разбор как таковой, но действительно включает разбор. Компонент PHP XSLTProcessor сделает это.

Другая важная идея, которую, я думаю, DOMDocument не поддерживает, - это потоковый парсер. Анализатор использует XML линейным образом и при этом вызывает функции обратного вызова в каждом интересующем узле. Несколько почтенный синтаксический анализатор SAX - AFAIK, архетипический потоковый анализатор. Раньше в PHP был SAX-парсер, я думаю, что теперь он перемещен в PEAR или PECL.

Но, да, что вы хотите сделать со своим XML?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...