пятница, 25 октября 2013 г.

PHP: работа с XML

XML – один из самых распространенных способов представления данных в интернете, и надо уметь его правильно использовать.

Итак. Что потребуется. Для начала потребуется заготовка в виде простого xml. (test.xml)

<?xml version="1.0" encoding="UTF-8"?>
<test>
 <data val="1">1</data>
 <data val="2">2</data>
 <data val="3">
  <innerdata attr="val">node</innerdata>
 </data>
</test>


Что будем использовать. Использовать будет расширение SimpleXML, доступное в PHP.

Работа с существующим документом


Самое простое, что можно сделать – это загрузить документ. Способов здесь два.

Первый – загрузить документ из файла:
$xml = simplexml_load_file('test.xml');


Второй – распарсить строку, содержащую xml:

$xmlString = file_get_contents("./test.xml");
$xml = new SimpleXMLElement($xmlString);


Данные представляются в виде объектов. Поэтому, чтобы получить доступ, например, к атрибуту “attr” узла innerdata, нам следует написать такой код:

$val = $xml->data[2]->innerdata["attr"];
echo $val."<br/>";


На экран будет выведено:
val


Никто не запрещает использовать foreach

foreach($xml->data as $data)
{
 echo "value = ${data[val]}<br/>";
}

value = 1
value = 2
value = 3

Добавление узлов и атрибутов


$node = $xml->addChild("data","data4 node");
$node->addAttribute("val","4");
print($xml->asXML());

<?xml version="1.0" encoding="UTF-8"?>
<test>
 <data val="1">data1 node</data>
 <data val="2">data2 node</data>
 <data val="3">
  <innerdata attr="val">node</innerdata>
 </data>
<data val="4">data4 node</data></test>

Подводные камни

print_r($xml->data[0]);
SimpleXMLElement Object ( [@attributes] => Array ( [val] => 1 ) [0] => 1 )

Если не хотите, чтобы при работе возникали проблемы, то следует позаботится об этом заранее
print_r((String)$xml->data[0]);
1

Windows 7: проблемы c сетью

Всё было хорошо. Образ успешно записался на болванку и настала очередь установки. После того, как новый, еще только с мсдн, виндовс был набит столь необходимым софтом, возникла проблема - отвалилась сеть.

В центре управления сетью появилась вот такая картина:


Странно конечно. Один сетевой адаптер и две сети на нем: network и unidentified network.

Вывод команды ipconfig показал следующее

   Default Gateway . . . . . . . . . : 0.0.0.0
                                                 192.168.0.1
   DHCP Server . . . . . . . . . . . : 192.168.0.1


Адрес шлюза 0.0.0.0 точно не мог быть получен по dhcp. Виновником оказался сервис bonjour, который устанавливает пакет cs3 от adobe (оригинал тут). Кстати, такая же проблема наблюдается и в vista, но отсутствует в windows 7 beta и rc.

Как поступать в этом случае?

Простой вариант: зайти в центр управления, отключить, а затем включить сеть. тогда настройки определяются верно. Но после перезагрузки системы, либо после физического отключения и последующего подключения сетевого кабеля (беспроводной сети) все настройки возвращяются к неправильному состоянию.

Второй вариант (идеологически верный) - отключить и удалить bonjour (источник).

Итак:

  • Запустить командную оболочку с правами админа
  • Перейти в каталог c:\program files\bonjour
  • Выполнить "mDNSResponder -remove" - это удалит сервис бонжур
  • Переименовать mdnsnsp.dll во что-то иное
  • Перезагрузиться
  • Удалить каталог :\program files\bonjour
  • Выполнить "netsh winsock reset" для сброса настроек winsock
  • Перезагрузиться

Всё. Теперь сеть работает как положено. А в центре управления можно увидеть такую картину:


А ipconfig показывает

   Default Gateway . . . . . . . . . : 192.168.0.1
   DHCP Server . . . . . . . . . . . : 192.168.0.1
   DNS Servers . . . . . . . . . . . :  192.168.0.1