2014-11-25 5 views
0

Это сводит меня с ума. Я мог бы скопировать и вставить 2 значения, которые мне нужны, и были сделаны с этим 30 минут назад, но вместо этого я пытаюсь сделать это «правильно».Simplexml PHP - получить значение «глубокого узла»

Во всем файле есть только одно имя пользователя. Как мне это получить? Я пробовал использовать xpath ($username=$xml->xpath('default_setup/connection/username');), и я попытался связать узлы с ним ($ username = $ xml -> {... полный путь здесь ...} -> default_setup-> connection-> имя_пользователя; `).

Когда я print_r($xml), я вижу все узлы, которые я хочу, и их значения. Когда я print_r($username), я ничего не получаю.

<?php 
$xml = simplexml_load_file('database.xml',NULL,LIBXML_NOCDATA); // connection details are inside of CDATA 

$username=$xml->xpath('default_setup/connection/username'); ?> 
<p>Username: <?= (string)$username ?></p><?php // outputs "Array" 

<?php 
foreach($xml as $element) { 
     echo $element . '<br />'; // outputs '<br />' 2 times. 
} 
?> 
<pre> 
Username: 
<?php print_r($username) ?><?php // nothing ?> 
xml: 
<?php print_r($xml) ?><?php // full set of all nodes with everything I need just out of reach ?> 
</pre> 

Вот образец xml. (Это на самом деле Magento «и т.д./приложение/local.xml» файл)

<default_setup> 
    <connection> 
     <host><![CDATA[localhost]]></host> 
     <username><![CDATA[secret_username]]></username> 
     <password><![CDATA[secret_password]]></password> 
     <dbname><![CDATA[testing_database]]></dbname> 
     <initStatements><![CDATA[SET NAMES utf8]]></initStatements> 
     <model><![CDATA[mysql4]]></model> 
     <type><![CDATA[pdo_mysql]]></type> 
     <pdoType><![CDATA[]]></pdoType> 
     <active>1</active> 
    </connection> 
</default_setup> 
+0

у вас есть пример XML по этому конкретному вопросу? чтобы мы знали, как это выглядит? – Ghost

+0

@Ghost ok Я добавил последнюю часть пути. ('Default_setup/подключение/имя пользователя'). –

ответ

0

позволяет избавиться от вашей проблемы, чтобы упростить вещи. вот пример.

файл XML, example.php:

<?php 
$xmlstr = <<<XML 
<?xml version='1.0' standalone='yes'?> 
<movies> 
<movie> 
    <title>PHP: Behind the Parser</title> 
    <characters> 
    <character> 
    <name>Ms. Coder</name> 
    <actor>Onlivia Actora</actor> 
    </character> 
    <character> 
    <name>Mr. Coder</name> 
    <actor>El Act&#211;r</actor> 
    </character> 
    </characters> 
    <plot> 
    So, this language. It's like, a programming language. Or is it a 
    scripting language? All is revealed in this thrilling horror spoof 
    of a documentary. 
    </plot> 
    <great-lines> 
    <line>PHP solves all my web problems</line> 
    </great-lines> 
    <rating type="thumbs">7</rating> 
    <rating type="stars">5</rating> 
</movie> 
</movies> 
XML; 
?> 

РНР код для извлечения участка, в вашем случае будет быть имя пользователя:

Пример # 2 Получение

<?php 
include 'example.php'; 

$movies = new SimpleXMLElement($xmlstr); 

echo $movies->movie[0]->plot; 
?> 

это получена от: http://php.net/manual/en/simplexml.examples-basic.php


thats ok, бывает.

вы можете попробовать это, специальное значение * соответствует всем тегам.

<?php 
$xml = <<< XML 
<?xml version="1.0" encoding="utf-8"?> 
<books> 
<book>Patterns of Enterprise Application Architecture</book> 
<book>Design Patterns: Elements of Reusable Software Design</book> 
<book>Clean Code</book> 
</books> 
XML; 

$dom = new DOMDocument; 
$dom->loadXML($xml); 
$books = $dom->getElementsByTagName('book'); 
foreach ($books as $book) { 
    echo $book->nodeValue, PHP_EOL; 
} 
?> 

дайте ему попробовать. вот URL-адрес от php.net: http://php.net/manual/en/domdocument.getelementsbytagname.php

Если вы посмотрите ниже, есть еще примеры.

+0

У вас 1 уровень или около того. Мне нужно пройти еще несколько уровней. Должен ли я включать '[0]' для промежуточных узлов, даже если они являются уникальными именами узлов? И мой целевой узел является единственным во всем документе, который называется «имя пользователя», поэтому почему я не могу просто ПОЛУЧИТЬ ЭТО! ?? !! Разочарование опыта, это. Спасибо за вашу помощь! –

3

Youre отсутствуют некоторые узлы, которые путь цепи вы хотите это:

$conn = $xml->global->resources->default_setup->connection; 
$user = (string) $conn->username; 
$pass = (string) $conn->password; 

Вы можете использовать XPath здесь, но его на самом деле больше хлопот, потому что он всегда будет возвращать массив узлов (представление NodeList), так вам придется перевернуть его или использовать [0]. Его проще/читабельнее просто использовать прямой доступ. Тем не менее, чтобы сделать это с помощью XPath будет:

$nodes = $xml->xpath('//default_setup/connection'); 
if (count($nodes) > 0) { 
    $conn = $nodes[0]; 
    $user = (string) $conn->username; 
    $pass = (string) $conn->password; 
} 

Полный XML-код/​​соединение от моего импортера в случае, если это помогает:

// get path for config 
$config = realpath(dirname(__FILE__) . '/../magento/app/etc/local.xml'); 

if (!$config) { 
    // I've made a terrible mistake. 
    throw new Exception('Could not load magento config.'); 
} else { 
    // load up XML 
    $conf = new SimpleXMLElement($config, LIBXML_NOCDATA, true); 

    // pull the database connection config node 
    $conn = $conf->global->resources->default_setup->connection; 

    // create a DSN - we will worry about manually setting the attributes ourself 
    // since this is a simple one off 
    $dsn = sprintf('mysql:host=%s;dbname=%s', $conn->host, $conn->dbname); 
    $user = (string) $conn->username; 
    $pass = (string) $conn->password; 
    $db = new PDO($dsn, $user, $pass); 


    if (!$db instanceof PDO) { 
     // WOMP, WOMP! 
     throw new Exception('Could not create database connection!'); 
     exit; 
    } 
} 
+0

Итак, вы говорите, что если кто-то хочет получить узел «соединение», и это единственный такой узел в документе, что они должны включать все узлы из глобальной системы, чтобы их получить? –

+0

Да, если вы не используете xpath, но, как я сказал в своем ответе, xpath больше связан с этим конкретным экземпляром. – prodigitalson

+0

Спасибо, ваш ответ работает. Но мне интересно, если что-то не так с моим использованием xpath. Я думал, что допустил правильный путь, но, похоже, я ничего не получаю. Почему мой 'print_r' ничего не показывает? –

Смежные вопросы