Экспорт определенных элементов из XML - PullRequest
1 голос
/ 17 декабря 2011

Я хотел бы экспортировать (или сохранить) вложенные теги, которые имеют определенный атрибут в XML. Поскольку я не знаю название этого процесса, я не могу найти какую-либо соответствующую информацию о нем в сети. И поскольку это трудно объяснить, я решил привести примеры для моей проблемы.

Допустим, у меня есть этот XML-файл:

<results>
    <result idSite="1">
        <row>
            <label>category</label>
            <visits>2</visits>
            <idsubdatatable>5</idsubdatatable>
            <subtable>
                <row>
                    <label>uncategorized</label>
                    <visits>2</visits>
                    <idsubdatatable>6</idsubdatatable>
                    <subtable>
                        <row>
                            <label>/index</label>
                            <visits>2</visits>
                            <url>http://mysite1.com/category/uncategorized/</url>
                        </row>
                    </subtable>
                </row>
            </subtable>
        </row>
        <row>
            <label>about</label>
            <visits>1</visits>
            <idsubdatatable>7</idsubdatatable>
            <subtable>
                <row>
                    <label>/index</label>
                    <visits>1</visits>
                    <url>http://mysite1.com/about/</url>
                </row>
            </subtable>
        </row>
    </result>
    <result idSite="2">
        <row>
            <label>/calendar</label>
            <visitors>1</visitors>
            <url>http://mysite2.com/calendar</url>
        </row>
    </result>
</results>

И я должен проанализировать результаты и сохранить только те строки, которые имеют атрибут <url>. Как это:

xml parsing

После разбора мне нужно объединить эти строки в новый XML-файл, и конечный результат должен быть таким:

<result>
<row>
    <label>/index</label>
    <visits>2</visits>
    <url>http://mysite1.com/category/uncategorized/</url>
</row>
<row>
    <label>/index</label>
    <visits>1</visits>
    <url>http://mysite1.com/about/</url>
</row>
<row>
    <label>/calendar</label>
    <visitors>1</visitors>
    <url>http://mysite2.com/calendar</url>
</row>
</result>

Обычно я хочу сделать этот процесс на PHP, но, возможно, на других языках. Так что, если у вас есть идея решить эту проблему, пожалуйста, прокомментируйте.

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

Я бы использовал запрос xpath, чтобы найти все узлы URL внутри узлов строки. Затем просто добавьте родительский узел каждого найденного вами элемента url к новому DomDocument, например так:

$xml = '...';
$dom = new DomDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);

$new_dom = new DomDocument();
$result = $new_dom->createElement('result');
$new_dom->appendChild($result);

$xpath = new DOMXPath($dom);
$rows = $xpath->query('//row/url');

for ($i=0;$i<$rows->length;$i++) {
  $node = $new_dom->importNode($rows->item($i)->parentNode, TRUE);
  $result->appendChild($node);
}

$new_dom->formatOutput = TRUE;
echo $new_dom->saveXML();
1 голос
/ 17 декабря 2011

Я бы использовал simplexml для чтения в качестве входных данных, чтобы ваш анализ был простым.А потом я бы создал рекурсивную функцию, такую ​​как:

function isUrlElement($element){
    foreach($element->children() as $children){
        if($children->getName() == 'url'){
            return true;
        }else{
            isUrlElement($children);
        }
    }
}

Теперь это далеко не завершено, но вы можете сделать это рекурсивным, вызывая его для каждого потомка.Когда это вернет true, вы узнаете, что нашли узел с URL-адресом в качестве дочернего элемента.Используйте этот узел $ element, например, чтобы добавить его в массив симплексных элементов, а затем просто передать его обратно в XML.

Имеет ли это смысл?

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