Привет, я отсутствую Атрибуты в XML-объекте [дубликат]

Это будет работать:

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

Символ ? означает, что предыдущая группа должна совпадать с нулем или один раз. Группа (-|\s) будет соответствовать символу - или |. Добавление ? после второго появления этой группы в вашем регулярном выражении позволяет вам сопоставить последовательность из десяти последовательных цифр.

95
задан Deduplicator 10 February 2015 в 23:36
поделиться

7 ответов

Если вы ищете список этих атрибутов, XPath будет вашим другом

print_r($xml->xpath('@token'));
73
ответ дан hakre 16 August 2018 в 04:17
поделиться
  • 1
    Интересно отметить, что $b будет объектом SimpleXMLElement, поэтому print_r и var_dump дадут вам странные вещи. Вы можете использовать его как строку (или что угодно), чтобы обойти это. – jxmallett 16 April 2014 в 01:39
  • 2
    Я соглашаюсь с вашим первым неправильным форматом, потому что я получаю краху страницы - однако многие люди утверждают, что это работает. Любое объяснение или нюанс об этом? – Gerard ONeill 8 January 2015 в 15:26
  • 3
    & quot; Неправильные форматы & quot; Работа. Я всегда использую первый пример. Почему это неправильно? – Grzegorz 11 September 2015 в 09:10
  • 4
    Технически $xml->attributes()->{'field'}, $xml->attributes()->field и $f='field'; $xml->attributes()->$f; совпадают. Не вижу причин, почему один правильный формат, а другой неправильный. – zysoft 12 September 2015 в 22:36
  • 5
    «& Quot; & quot ;. $ b, чтобы сохранить его как строку – dr_rk 3 March 2016 в 16:35
  • 6
    $ xml- & gt; attributes () - & gt; {'field'} является правильным, поскольку он безопасен для использования со специальными символами в имени атрибута (например, «data-attr»). Поле $ xml- & gt; attributes () - & gt; работает только для атрибутов, которые представляют собой одиночные буквенно-цифровые слова – vzr 6 January 2017 в 11:39
  • 7
    Получение SimpleXMLElement при использовании обоих правильных параметров. – Darius.V 3 July 2018 в 12:03
73
ответ дан hakre 6 September 2018 в 03:01
поделиться
73
ответ дан hakre 29 October 2018 в 09:43
поделиться
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;

$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]

Используйте SimpleXMLElement::attributes .

Истина заключается в том, что обработчик SimpleXMLElement get_properties занимает большое время. Нет свойства с именем «@attributes», поэтому вы не можете делать $sxml->elem->{"@attributes"}["attrib"].

35
ответ дан Artefacto 16 August 2018 в 04:17
поделиться
  • 1
    Спасибо за объяснение why SimpleXML ведет себя этим странным образом (обработчик get_properties). Очень интересно. – andrewtweber 2 April 2014 в 06:05
  • 2
    Получение SimpleXMLElement при выполнении этого вместо ценности – Darius.V 3 July 2018 в 12:01

К сожалению, у меня есть уникальная сборка (застрявшая с Gentoo на данный момент) PHP 5.5, и я обнаружил, что

 $xml->tagName['attribute']

был единственным решением, которое сработало. Я пробовал все методы Боры выше, в том числе «Right & amp; Quick ', и все они потерпели неудачу.

Тот факт, что это самый простой формат, является плюсом, но мне не нравилось думать, что я безумно пытался использовать все форматы, о которых говорили другие.

Njoy за то, что его стоит (я упомянул уникальную сборку?).

2
ответ дан Gerard ONeill 16 August 2018 в 04:17
поделиться
  • 1
    Обычно я рекомендую использовать нотацию массива для атрибутов для атрибутов в том же пространстве имен элемента, в котором они находятся. Я бы сказал, что это самый простой формат (поскольку вы монете его) по какой-то причине. массив-доступ с именованным ключом = атрибут с элементом simplexml. – hakre 3 July 2015 в 22:19

Это помогло мне преобразовать результат simplexml_load_file ($ file) в структуру JSON и декодировать его обратно:

$xml = simplexml_load_file("$token.xml");
$json = json_encode($xml);
$xml_fixed = json_decode($json);

$try1 = $xml->structure->{"@attributes"}['value'];
print_r($try1);

>> result: SimpleXMLElement Object
(
)

$try2 = $xml_fixed->structure->{"@attributes"}['value'];
print_r($try2);

>> result: stdClass Object
(
    [key] => value
)
1
ответ дан t2m 16 August 2018 в 04:17
поделиться

Попробуйте

$xml->attributes()->Token
106
ответ дан zysoft 16 August 2018 в 04:17
поделиться
  • 1
    Это уже ответили на @Artefacto . – hakre 27 September 2012 в 13:12
  • 2
    Да, но в более сложной форме – zysoft 27 September 2012 в 13:23
  • 3
    Да, это самое элегантное решение. – Christian 23 May 2014 в 06:59
  • 4
    Я пробовал это, и я думаю, что страница рушится. Кажется, что Бора считает, что это неправильный формат, с которым я согласен в данный момент. Однако я видел этот (ваш) формат, упомянутый несколько раз. Есть ли какой-то нюанс, которого я пропускаю? – Gerard ONeill 8 January 2015 в 15:25
  • 5
    @GerardONeill, я не понимаю, почему Bora говорит, что это неправильный способ доступа к атрибутам, он работает очень хорошо. То, что вам может не хватать, заключается в том, что вам нужно вызвать attributes() для объекта, соответствующего правильному тегу в вашем XML. Например, если у вас есть <root><tag attr="a">b</tag></root>, вам нужно сделать $xml->tag->attributes()->attr для доступа к нему. – zysoft 12 September 2015 в 22:30
Другие вопросы по тегам:

Похожие вопросы: