Nano Hash - криптовалюты, майнинг, программирование

Отображение данных через PHP и проблема SimpleXML

Я рассмотрел много вопросов SimpleXML на этом сайте. Мои данные немного странные, и я не могу это изменить. Я пытаюсь получить из своих данных такие вещи, как «Building1» и «Hostname1», чтобы я мог взять эти данные и найти другие данные, а затем отобразить их.

Вот пример моих данных:

    <?xml version='1.0' encoding='UTF-8'?>
<results preview = '0'>
    <result offset='0'>
        <field k='hostname'>
          <value h='1'><text>Hostname 1</text></value>
        </field>
        <field k='os'>
          <value><text>Windows 7</text></value>
        </field>        
        <field k='location'>
          <value h='1'><text>Building 1</text></value>
        <field>
    </result>
   <result offset='1'>
        <field k='hostname'>
          <value h='1'><text>Hostname 2</text></value>
        </field>
        <field k='os'>
          <value><text>Windows 10</text></value>
        </field>        
        <field k='location'>
          <value h='1'><text>Building 2</text></value>
        </field>
     </result>
........

И вот как я пытаюсь на это смотреть:

$xml = simplexml_load_file(data.xml);
print_r($xml);    
$testArray = new SimpleXMLElement($xml);
$records = $testArray->results->result;
print_r($records);

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

07.03.2019


Ответы:


1

Это очень распространенная ошибка, но ее очень трудно обнаружить, если вы не знаете, что ищете: первый объект, который вы получаете при синтаксическом анализе XML, — это корневой элемент, а не нечто, представляющее документ.

Итак, в вашем случае $testArray является элементом <results preview = '0'>, и вы хотите $testArray->result, а не $testArray->results->result.

Кстати, "testArray" - плохое имя для этой переменной - это не массив, это объект.

08.03.2019
  • Это имеет смысл. Однако, когда я выгружаю $testArray (который я переименовал в $testObject), я вижу следующие результаты: 1) 0 } [field']= array(18) ` Итак, я предполагаю, что testOject является XML-элементом. Я пытаюсь: $objects = new SimpleXMLElement($testArray->result); Как мне перейти отсюда?. 11.03.2019
  • Извините, я поставил обратные кавычки вокруг своего кода, но он не появился в ответе. 11.03.2019
  • @user1309220 user1309220 Вам не нужен new SimpleXMLElement($testArray->result), просто $testArray->result, который уже является объектом, который вы можете использовать в цикле, например. foreach ( $testObject->result as $result ) { echo $result['offset']; }. См. примеры в руководстве. 11.03.2019
  • Ok. Думаю, я продолжаю путаться, потому что в моем xml есть такие значения, как поле k='hostname', а в других примерах этого нет. Мне действительно нужны значения в ‹text›‹text› xml. Спасибо 11.03.2019
  • @user1309220 user1309220 Это элемент с именем field с атрибутом k. См. примеры 5 и 6 на странице руководства, на которую я ссылаюсь. 11.03.2019

  • 2

    Я использовал xml как строку в файле

    <?php
    $sXmlString = <<<EOF
    <?xml version="1.0" encoding="UTF-8"?>
    <results preview = "0">
        <result offset="0">
            <field k="hostname">
              <value h="1"><text>Hostname 1</text></value>
            </field>
            <field k="os">
              <value><text>Windows 7</text></value>
            </field>        
            <field k="location">
              <value h="1"><text>Building 1</text></value>
            </field>
        </result>
        <result offset="1">
            <field k="hostname">
              <value h="1"><text>Hostname 2</text></value>
            </field>
            <field k="os">
              <value><text>Windows 10</text></value>
            </field>        
            <field k="location">
              <value h="1"><text>Building 2</text></value>
            </field>
        </result>
    </results>
    EOF;
    
    echo '<pre>';
    $xml = simplexml_load_string($sXmlString);
    print_r($xml);
    echo '<hr/>';
    echo count($xml->result);
    echo '<hr/>';
    foreach($xml->result as $report)
    {
        var_dump($report);
        echo '<hr/>';
    }
    

    В коде вы можете видеть, что $xml ссылается на элемент «результаты» (или корень). Вам нужно путешествовать от корня к дочерним элементам. $xml->result даст объект результата в наборе результатов, и вам нужно перейти к циклу, поскольку он представляет собой массив объектов.

    08.03.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..