2009-05-02 6 views
2

Как сделать I:PHP XPath - получить только атрибуты тега/удалить внутреннее содержимое тега

  1. Скрыть все между между головными тегами в XPath «/ HTML/голова» запрос?

Например, на «<html><head><title>some title</title>some text</head> ...» будет производить nodeValue = «некоторое название какого-то текст», который не имеет никакого значения, потому что мне просто нужен атрибуты тегов и мне не нужно, чтобы добавить нерелевантные данные в свою базу данных.

  1. Скрыть все дочерние/потоковые узлы в запросе xpath "/ html/body"?

Например, на «<html><body><div>some anchor</div>some text</body> ...» будет производить nodeValue = «некоторый якорь некоторый текст» «некоторый текст» имеет отношение к метке тела и мне нужно, чтобы сохранить его и получить поездку все остальное.

Также я не хочу полностью удалять их из документа dom!

+0

Вы не хотите хранить данные в своей базе данных, но вы хотите, чтобы DOM не пострадал? WFT? Может быть, вы должны сказать нам, что вы на самом деле пытаетесь усвоить, поскольку ваш вопрос в его нынешнем виде имеет мало смысла? PHP имеет множество способов использования XPath через DOM-считыватель через объект SimpleXML, через XSLT и в зависимости от версии PHP, с помощью различных стилей пива. Какой из них вы используете? – AlexanderJohannesen

+0

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

+0

Ну, причина, по которой я просил сделать то, что вы пытаетесь выполнить, и какие версии PHP и ваша среда у вас есть, заключается в том, что это тривиальный материал в XSLT, возможно, даже достаточно простой в SimpleXML, но прежде, чем я потрачу много хруст, это было бы здорово с несколькими направленными подсказками. :) – AlexanderJohannesen

ответ

0

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"; 
} 

Надеюсь, что я помог, удачи!

+0

рассматривает ваши edit - да, это правда, но это часть функции, которая обходит структуру дерева html, что означает, что она добавит информацию, хочу я ее или нет, если я не укажу каждый тип тега (узла), который я хочу, чтобы он игнорировал (который раздражает меня :)) – EddyR

1

В таком случае возможно preg_match, как этот, может быть, что вам нужно?

preg_match('/<head (.*)>/', $file_contents, $matches); 
echo (isset($matches[1])) ? $matches[1] : ''; 
1

, который не имеет никакого значения, потому что мне просто нужно тег атрибуты

Я не уверен, где атрибуты в вашем примере. И я не эксперт по внедрению PHP xpath.

Однако вы можете попробовать следующее:

  • использовать функцию text() XPATH в конце вашего выражения (например "/html/head/text()"), чтобы получить только текстовые узлы, не теги
  • функция XPath должна возвращать NodeList. Вы используете это для получения всего фрагмента XML - например. DOMXpath делает как раз это.
Смежные вопросы