EDIT: О главном элементе - вы хотите получить только атрибуты главного элемента, вы можете использовать XPath («// голова») and then $head->attributes.
Я не буду прямо отвечать на ваш вопрос, который не очень насыщен деталями, но я скорее расскажу историю о своем собственном опыте. Я считаю, что вы можете решить свои проблемы, если поймете, какие последствия я приношу.
Я понимаю из тегов, которые вы хотите использовать PHP на работе. В последнее время у меня была аналогичная проблема, когда мне пришлось анализировать около 100 статических html-документов и извлекать часть информации, чтобы поместить ее в базу данных. Сначала я думал о регулярных выражениях, но по мере того, как я шел, я видел, что это будет утомительная задача.
Так что я в конечном итоге столкнулся с XPath и SimpleXML в PHP.
Вот как я в конечном итоге:
$file_contents = file_get_contents($file);
$dom = new DOMDocument;
$dom->loadHTML($file_contents);
$document = simplexml_import_dom($dom);
Теперь у меня есть объект SimpleXML, который держит HTML код. Это действительно здорово - вот как она катится:
Предположим, у вас есть следующий HTML код:
<div id="content">
<div class="description">
<dl>
<dt>Title</dt>
<dd>
<ul><li> first item </li> <li> second item</li></ul>
<p> a paragraph.. </p>
</dd>
</dl>
</div>
</div>
Теперь вы можете перебрать все < Д.Л. > элементов в коде, которые дети ДИВО # описание и внуки сОн # содержания так:
foreach($document->xpath("//div[@id='content']/div[@class='description']/dl") as $element)
, а затем все дети обрабатываются через рекурсивную функцию, как это:
function recurse($parent)
{
echo '<' . $parent->getName() . '>' . "\n";
#echo $parent # you might want to strip any white spaces like \t and \n here
foreach($parent->children() as $child)
{
if(count($child->children()) > 0)
{
recurse($child);
}
else
{
echo '<' . $child->getName() . '>';
echo $child;
echo '</' . $child->getName() . '>' . "\n";
}
}
echo '</' . $parent->getName() . '>' . "\n";
}
Надеюсь, что я помог, удачи!
Вы не хотите хранить данные в своей базе данных, но вы хотите, чтобы DOM не пострадал? WFT? Может быть, вы должны сказать нам, что вы на самом деле пытаетесь усвоить, поскольку ваш вопрос в его нынешнем виде имеет мало смысла? PHP имеет множество способов использования XPath через DOM-считыватель через объект SimpleXML, через XSLT и в зависимости от версии PHP, с помощью различных стилей пива. Какой из них вы используете? – AlexanderJohannesen
Потому что, если его нетронутым, как я могу прочитать те теги childs, когда я пересекаю дерево позже. Я разбиваю каждый тег на все его атрибуты и содержимое, но не на потомки, связанные с ним. Заголовок тега отличается от того, что любой прямой текст, размещенный в нем, следует игнорировать. Поэтому, если у меня есть функция для прохождения каждого тега в html-документе, он всегда будет запрашивать все теги и содержимое, если я не укажу иначе. – EddyR
Ну, причина, по которой я просил сделать то, что вы пытаетесь выполнить, и какие версии PHP и ваша среда у вас есть, заключается в том, что это тривиальный материал в XSLT, возможно, даже достаточно простой в SimpleXML, но прежде, чем я потрачу много хруст, это было бы здорово с несколькими направленными подсказками. :) – AlexanderJohannesen