Как удалить теги внутри тега PHP XML MYSQL GCIDE, оставляя текст - PullRequest
0 голосов
/ 20 декабря 2011

Я пытался найти способ превратить файл gcide xml в структурированный дамп sql, и, хотя у меня был небольшой успех, кажется, что полученные результаты ограничены.

Мне нужно знать способ удаления тегов внутри другого тега в XML-файле.

например.

<entry><def>some def <altname>hey</altname></def></entry>

удалить "altname", но оставить значение доступным для тега "def".

Или используя php для удаления дочерних узлов, сохраняя значение, доступное для parent, в виде строки.

Попытка преобразования родителя в строку, но обнаружилось, что дочерние узлы были удалены. Также использовался загружаемый xml-файл mysql, но были те же проблемы со структурой.

используемые файлы GCIDE

http://rali.iro.umontreal.ca/GCIDE/new-entries.zip

если вы сможете конвертировать файлы в дамп sql, тогда это будет высоко оценено.

1 Ответ

0 голосов
/ 20 декабря 2011

Эта кодовая полоса помечается в целевой метке ():

$str = "<entry><def>some def <altname>hey</altname></def></entry>";

$dom = new domDocument();
$dom -> loadXML($str);

// use getElementsByTagName or use DOMXPath($dom) to find your tag which don't contain other tags
$tags = $dom -> getElementsByTagName("def"); 

$contents = "";
for($i = 0; $tags -> length > $i; $i++){
    $contents = $tags -> item($i) -> nodeValue; //content without tags
    $children = $tags -> item($i) -> childNodes;
    remove_children($tags -> item($i)); //recursively remove chiled nodes
    $tags -> item($i) -> appendChild($dom -> createTextNode($contents));
}

//recursively remove chiled nodes
function remove_children(&$node) {
  while ($node->firstChild) {
    while ($node->firstChild->firstChild) {
      remove_children($node->firstChild);
    }
    $node->removeChild($node->firstChild);
  }
}

echo $dom -> saveXML();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...