Сценарий: добавление атрибута в XML-файл
Чтобы избежать повторяющейся задачи ручного добавления одного и того же атрибута ко всем элементам на одном уровне в XML-файле, воспользуемся этим PHP 5 скриптом, который требует трех параметров.
В первом сценарии addatt значения атрибутов будут добавлены вручную.
Второй сценарий, addval, считывает значения из массива, который он создает, из другого XML-файла.
Добавление атрибутов без значений
Например, из этого документа:
<doc>
<car model="xxx" />
<car model="yyy" />
</doc>
Мы хотим автоматически добавлять атрибут «скорость» к тегам «автомобиль».
<doc>
<car model="xxx" speed="80" />
<car model="yyy" speed="90" />
</doc>
Использование сценария
Он требует трех параметров.
- Имя XML-файла (fname).
- Имя тега (tname).
- Имя добавляемого атрибута (aname).
Команда имеет следующий формат:
solp addatt fname tname aname
Новый XML-документ сохраняется под именем test.xml.
Затем мы удаляем исходный файл, чтобы переименовать test.xml под его именем .
Код скриптола
DOMDocument docsrc = DOMDocument("1.0")
docsrc.load(filename)
DOMNodeList dnl = docsrc.getElementsByTagName(tname)
DOMElement de = null
int i = 0
while i < dnl.length
de = dnl.item(i)
de.setAttribute(aname, "")
let i + 1
docsrc.save(filename)
PHP-код
$docsrc=new DOMDocument("1.0");
$docsrc->load($filename);
$dnl=$docsrc->getElementsByTagName($tname);
$i = 0;
while($i<$dnl->length)
{
$de=$dnl->item($i);
$de->setAttribute($aname,"");
$i+=1;
}
$docsrc->save($filename);
Добавление атрибутов с их значениями
Использование сценария
Добавляется последний параметр - имя XML-файла, в котором считываются значения.
Кодекс
Предыдущая функция изменяется для считывания значений из массива и назначения их элементам.
При этом предполагается, что элементы имеют идентификатор, который также находится в массиве. Для этого создадим ассоциативный массив с идентификаторами в качестве ключей и значениями атрибута в качестве значений.
Чтение значений из XML-файла
DOMNodeList dnl = docval.getElementsByTagName(tname)
DOMElement de = null
array a = {}
for int i in 0 -- dnl.length
de = dnl.item(i)
text id = de.getAttribute(tagid) // get the ID
text value = de.getAttribute(aname) // get the value of the property for this ID
a[id] = value
/for
Присвоение значений
while i < size
de = dnl.item(i)
text id = de.getAttribute(tagid)
de.setAttribute(aname, a[id])
let i + 1
На этот раз атрибуты назначаются на основе имени тега и идентификатора элемента, который должен быть ключом в массиве.