2009-11-05 3 views
1

У меня есть файл с данными в следующем формате:Разбор данных (PHP, MySQL)

<user> 
    <fname>Anthony</fname> 
    <lname>Smith</lname> 
    <accid>3874918</accid> 
</user> 

<user> 
    ... 
</user> 

Я пытаюсь разобрать эти данные и хранить его в базу данных MySQL с follwing полей: FName, LNAME , accid.

Теперь проблема заключается в том, как определить <user> и </user>, чтобы я мог анализировать данные внутри него? Спасибо.

ответ

4

Если это действительный XML, используйте SimpleXML. Сначала вам нужно будет убедиться, что у вас есть один корневой элемент, например <users>:

<?php 
$str = "<users> 
      <user>...</user> 
      <user>...</user> 
     </users>"; 

$xml = simplexml_load_string($str>; 
foreach ($xml as $user) { 
    // Make a query using $user->fname, $user->lname, $user->accid 
} 
+0

Недействительный XML, если он не содержит ни одного корневого узла. – soulmerge

+0

Да, это правда. Я не был уверен, опубликовал ли он только экстракт или истинное представление структуры документа. –

1

Если это xml-файл, я бы предложил использовать синтаксический анализатор XML (this?) Вместо того, чтобы играть с регулярными выражениями и/или строковыми функциями.

1

Вы должны это использовать с помощью парсера dom (или анализатора xml, в зависимости от ваших данных). Это будет выглядеть примерно так (предупреждения: непроверенный код):

$dom = new DOMDocument(); 
$dom->loadXML($xmlString); 
$list = $dom->getElementsByTagName('user'); 
for ($i = 0; $i < $list->length; $i++) { 
    $userNode = $list->item($i); 
    $node = $userNode->firstChild(); 
    while ($node !== NULL) { 
     switch ($node->$nodeName) { 
      case 'fname': 
       // ... 
     } 
     $node = $node->nextSibling(); 
    } 
} 
1

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

Вот пример:

$names = simplexml_load_file('names.xml'); 

foreach ($names->user as $user) { 

$pdo->exec("INSERT INTO names (fname, lname, accid)" . " VALUES ('" . $user->fname . " ', '" . $user->lname . "','" . $user->accid . "')") 
or die("failed insert"); 

} 

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

1

Если вы используете PHP5.x, SimpleXML поможет вам.

<?php 
$sample = <<<END                            
<foo> 
<user> 
    <fname>Anthony</fname> 
    <lname>Smith</lname> 
    <accid>3874918</accid> 
    </user> 
    <user> 
    <fname>foo</fname> 
    <lname>bar</lname> 
    <accid>123</accid> 
    </user> 
</foo> 
END; 

$xml = simplexml_load_string($sample); 
var_dump($xml); 
Смежные вопросы