powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите прочитать XML
23 сообщений из 23, страница 1 из 1
Помогите прочитать XML
    #38874048
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С данной технологией пока незнаком.
Есть такой файл (привожу только начало, т.к. большой):
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument
xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core"
xmlns:aml="http://schemas.microsoft.com/aml/2001/core"
xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
w:macrosPresent="no"
w:embeddedObjPresent="no"
w:ocxPresent="no"
xml:space="preserve">
<o:DocumentProperties><o:Title>Заголовок документа</o:Title>



На PHP пишу:
Код: php
1.
2.
3.
4.
$xml = simplexml_load_file('sample.xml');
$strText = $xml->{'w:wordDocument'}->{'o:DocumentProperties'}->{'o:Title'};
$strText = iconv("UTF-8", "WINDOWS-1251",$strText);
echo($strText);



Но возвращается пустая строка, хотя ошибок PHP не выдает. Не пойму, как получить доступ к элементам дерева.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874060
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновНе пойму, как получить доступ к элементам дерева.
1) прочитать документацию
2) если не помогло - просто не указывать корневой элемент, $xml - это уже и есть SimpleXMLElement w:wordDocument
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874110
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил1) прочитать документацию
2) если не помогло - просто не указывать корневой элемент, $xml - это уже и есть SimpleXMLElement w:wordDocument
Документацию читаю только на русском, английскую переводить некогда. В русской больше ничего не нашёл, кроме простеньких примеров. Не указывать корневой и другие элементы конечно пробывал. Бесполезно. Возиться больше не стал.
Обойдусь функциями поиском-замены текста, так проще оказалось.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874119
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновБесполезно.
враньё
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874130
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал несколько функции для работы с XML Word. Документ Word нужно предварительно сохранить в формате XML через "Сохранить как". Все сделано через поиск-замену без дополнительных библиотек. Если кому надо, пользуйтесь:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
<?php

// БИБЛИОТЕКА PHP: функции для работы с XML

// ФУНКЦИЯ: установка значения
//	&$strDoc	- текст документа
//	$strField	- имя поля (в документе к именам полей нужно добавлять символ "1", например: Name1
//	$strValue	- значение поля
function DocXML_Value(&$strDoc, $strField, $strValue) {
	// определение длины текста
	if (!($intDoc = strlen($strDoc))) return;
	// определение кода поля
	$strCode = $strField."1";
	// определение длины кода поля
	if (!($intCode = strlen($strCode))) return;
	// поиск поля
	if (!($intPos = stripos($strDoc, $strCode))) return;
	// преобразование значения в кодировку UTF-8
	$strText = iconv("WINDOWS-1251", "UTF-8", $strValue);	
	// определение результата
	$strDoc = Left($strDoc, $intPos).$strText.Right($strDoc, $intDoc-$intPos-$intCode);
}

// ФУНКЦИЯ: получение текста таблицы
//	&$strDoc	- исходный документ
//	$strField	- имя поля (в документе к именам полей нужно добавлять символ "1", например: Name1
function DocXML_Table(&$strDoc, $strField) {
	// определение длины текста
	if (!($intDoc = strlen($strDoc))) return '';
	// определение кода поля
	$strCode = ">".$strField."1<";
	// определение длины кода поля
	if (!($intCode = strlen($strCode))) return '';
	// поиск поля
	if (!($intPos = stripos($strDoc, $strCode))) return '';
	// поиск тега <w:tbl> до поля
	if (!($intBegin = strripos(Left($strDoc, $intPos),'<w:tbl>'))) return '';
	// поиск тега </w:tbl> после поля
	if (!($intEnd = stripos($strDoc, '</w:tbl>', $intPos))) return '';
	// определение результата
	$strRes = Left(Right($strDoc,$intDoc-$intBegin),$intEnd-$intBegin+strlen('</w:tbl>'));
	// определение результата
	return $strRes;
}

// ФУНКЦИЯ: получение текста шаблона строки
//	&$strTable	- текст таблицы
//	$strField	- имя поля (в документе к именам полей нужно добавлять символ "1", например: Name1
function DocXML_Row(&$strTable, $strField) {
	// определение длины текста
	if (!($intTable = strlen($strTable))) return '';
	// определение кода поля 
	$strCode = ">".$strField."1<";
	// определение длины кода поля
	if (!($intCode = strlen($strCode))) return '';
	// поиск поля
	if (!($intPos = stripos($strTable, $strCode))) return '';
	// поиск тега <w:tr> до поля
	if (!($intBegin = strripos(Left($strTable, $intPos),'<w:tr>'))) return '';
	// поиск тега </w:tr> после поля
	if (!($intEnd = stripos($strTable, '</w:tr>', $intPos))) return '';
	// определение результата
	return Left(Right($strTable,$intTable-$intBegin),$intEnd-$intBegin+strlen('</w:tr>'));
}

// ФУНКЦИЯ: замена строки в таблице
//	&$strTable	- текст таблицы
//	$strField	- имя поля (в документе к именам полей нужно добавлять символ "1", например: Name1
//	$strRow	- текст строки
function DocXML_RowSet(&$strTable, $strField, $strRow) {
	// определение длины текста
	if (!($intTable = strlen($strTable))) return;
	// определение кода поля
	$strCode = ">".$strField."1<";
	// определение длины кода поля
	if (!($intCode = strlen($strCode))) return;
	// поиск поля
	if (!($intPos = stripos($strTable, $strCode))) return;
	// поиск тега <w:tr> до поля
	if (!($intBegin = strripos(Left($strTable, $intPos),'<w:tr>'))) return;
	// поиск тега </w:tr> после поля
	if (!($intEnd = stripos($strTable, '</w:tr>', $intPos))) return;
	// определение результата
	$strTable = Left($strTable, $intBegin).Right($strTable, $intTable-$intEnd-strlen('</w:tr>'));
}

// ФУНКЦИЯ: добавление строки в таблицу
//	&$strTable	- текст таблицы
//	$strRow	- текст строки
function DocXML_RowAdd(&$strTable, $strRow) {
	// определение длины текста
	if (!($intTable = strlen($strTable))) return;
	// определение результата
	$strTable = Left($strTable, $intTable-strlen('</w:tbl>')).$strRow.'</w:tbl>';
}

// ФУНКЦИЯ: вставка таблицы в документ
//	&$strDoc	- документ
//	$strField	- имя поля (в документе к именам полей нужно добавлять символ "1", например: Name1
//	&$strTable	- таблица
function DocXML_TableSet(&$strDoc, $strField, &$strTable) {
	// определение длины текста
	if (!($intDoc = strlen($strDoc))) return '';
	// определение кода поля
	$strCode = ">".$strField."1<";
	// определение длины кода поля
	if (!($intCode = strlen($strCode))) return '';
	// поиск поля
	if (!($intPos = stripos($strDoc, $strCode))) return '';
	// поиск тега <w:tbl> до поля
	if (!($intBegin = strripos(Left($strDoc, $intPos),'<w:tbl>'))) return '';
	// поиск тега </w:tbl> после поля
	if (!($intEnd = stripos($strDoc, '</w:tbl>', $intPos))) return '';
	// определение результата
	$strDoc = Left($strDoc, $intBegin).$strTable.Right($strDoc, $intDoc-$intEnd-strlen('</w:tbl>'));
}
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874131
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гениально!

Код: php
1.
!($intDoc = strlen($strDoc))
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874132
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример использования:
Например в документе Word заданы поля (просто написаны текстом в самом документе): Date1, Number1.
В таблице документа Word две строки (шапка и одна строка), два столбца. В строке пишем в каждой клетке соответственно: Cell11, Cell21.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
<?php

// загрузка шаблона отчёта
$strDoc = file_get_contents('report1.xml');

// заполнение шапки
DocXML_Value($strDoc, 'Date', 'Дата');
DocXML_Value($strDoc, 'Number', '№10');

// получение текста таблицы
$strTable = DocXML_Table($strDoc, 'Cell1');
// получение шаблона строки
$strRowT = DocXML_Row($strTable, 'Cell1');
// удаление шаблона строки
DocXML_RowSet($strTable, 'Cell1', '');

// вставка 1-й строки
	// копирование строки шаблона
	$strRow = $strRowT;
	// установка значений строки
	DocXML_Value($strRow, 'Cell1', 'Значение 1 1');
	DocXML_Value($strRow, 'Cell2', 'Значение 1 2');
	// вставка строки в таблицу
	DocXML_RowAdd($strTable, $strRow);	
// вставка 2-й строки
	// копирование строки шаблона
	$strRow = $strRowT;
	// установка значений строки
	DocXML_Value($strRow, 'Cell1', 'Значение 2 1');
	DocXML_Value($strRow, 'Cell2', 'Значение 2 2');
	// вставка строки в таблицу
	DocXML_RowAdd($strTable, $strRow);	

// вставка таблицы
DocXML_TableSet($strDoc, 'Cell1', $strTable);

// создание отчёта	
header('Content-type: application/msword');
header('Content-Disposition:attachment;filename="Документ1" );
echo $strDoc;

?>
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874133
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHookгениально!

Код: php
1.
!($intDoc = strlen($strDoc))


Ну как умею. А как надо?)
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874136
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там в коде ещё использовались фунции Left, Right:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// ФУНКЦИЯ: усечение строки до определенного количества символов
// $strText - исходный текст
// $lngLenCut - количество символов, которое остается после обрезки
function Left($strText, $lngLenCut)	{
	// выход, если строка пуста
	if (strlen($strText) == 0) return "";
	// определение результата
	return substr($strText,0,$lngLenCut);
}

// ФУНКЦИЯ: усечение строки до определенного количества символов справа
// $strText - исходный текст
// $lngLenCut - количество символов, которое остается после обрезки
function Right($strText, $lngLenCut) {
	// определение длины текста
	$lngLen = strlen($strText);
	// выход, если строка пуста
	if ($lngLen == 0) return "";
	// выход, если количество обрезаемых символов больше длины строки
	if ($lngLen < $lngLenCut) return $strText;
	// определение результата
	return substr($strText,$lngLen-$lngLenCut,$lngLen);
}
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874137
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновЕсли кому надо, пользуйтесь
только по приговору суда.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874192
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суровый челябинский программист. XML либы только для слабаков! Только работа со строками, только хардкор!
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874349
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZТолько работа со строками


и не забывать про обрезку слева. и справа.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38874648
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Смирнов,

Код: php
1.
print_r($xml);


Посмотрите.. у вас объект вообще загрузился?
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38875114
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почитал заглавия тем в профиле Смирнова, разных веток.

чувак то что-то явно амбициозное задумал. никак цмску пишет с кучей функционала которого нету у других.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38875327
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
внимательно прочтите http://php.net/manual/ru/simplexmlelement.children.php
у вас используется разные пространства имен, при чтении дочерних узлов необходимо указывать либо префикс (то что стоит до :),либо URN имени пространства (например, "urn:schemas-microsoft-com:office:office"). И вообще вам следует изучить как вообще работают пространства имен и префиксы у элементов.
Если коротко, то на одном уровне могут быть идентичные элементы, например, <Title>, и вы хотите их разделить, что бы они не перемешивались между собой, скажем одни принадлежат Иванову, другие Сидорову. При чтении нужно обязательно указать чьи элементы вы читаете, для этого существует URN - это объявления, а сами Title указываются с префиксом, который связан с объявленным URN. Аналогично и атрибуты.
Напрямую обращаться через префиксы наверное неверно, ведь я могу создать аналогичный документ с другими префиксами, но с теми же URN, скорей всего Word его откроет без проблем, а ваша программа нет, и возможно, разные версии того же Word могут генерировать один и тот же документ по разному, но с постоянными пространствами имен
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38875754
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sxq,
чего чего????simplexml_load_file-это не парсер.
Name space нужен либо для вас, либо для вашего парсера, что бы мог отличить свои узлы от чужих, если вы не указываете в simplexml_load_file ns и (bool) $is_prefix = true,то он должен зачитать весь файл, если конечно он валидный.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38876352
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kunaksergeysxq,
чего чего????simplexml_load_file-это не парсер.
Name space нужен либо для вас, либо для вашего парсера, что бы мог отличить свои узлы от чужих, если вы не указываете в simplexml_load_file ns и (bool) $is_prefix = true,то он должен зачитать весь файл, если конечно он валидный.

http://php.net/manual/ru/function.simplexml-load-file.php
что-то нигде нет ни слова то что вы говорите, есть эти параметры, но что они делают не написано.
Я могу предположить, что эти параметры помогают встраивать загружаемый документ в уже созданное пространство, там есть параметр, объект расширяющий simplexml, как именно, не могу сказать, надо пробовать.
На счет парсер или не парсер, больше чем уверен, что разбор (парсинг) документа происходит сразу после его загрузки, т.к. мы можем сразу обращаться к свойствам объектов, если бы парсинг производился при каждом обращении к каким-либо св-вам, то быстродействие было бы низким, а про добавление новых узлов вообще молчу.
На счет "вычищения" пространства имен и префиксов - очень большое сомнение, если удалить все это, то нарушится сама логика XML документа. Пространство имен является очень важным элементом в XML, поэтому навряд ли там что-то "вычищается".
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38876759
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновFishHookгениально!

Код: php
1.
!($intDoc = strlen($strDoc))


Ну как умею. А как надо?)

Ну хотя бы == ... Результат присваивания у тебя всегда вернет TRUE...
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38876802
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sxq,
Вы наверное меня не поняли...simplexml_load_file проверяет только на систаксис и если все нормально, то создает DOM модель в памяти,какое у вас ns ему по барабану, главное, что бы соответствовало стандарту xml.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38878448
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterНу хотя бы == ... Результат присваивания у тебя всегда вернет TRUE...Дак я специально и присваиваю сразу же, чтобы узнать длину, заодно узнать, что она есть.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38878451
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453почитал заглавия тем в профиле Смирнова, разных веток.
чувак то что-то явно амбициозное задумал. никак цмску пишет с кучей функционала которого нету у других.
Я уже её написал и уже в работу запустил. Как достигнет нормального уровня, выложу в бесплатный доступ. Я специализируюсь не на сайтах, а упор на работе с базами данных в офисе, формированием отчётов. Поэтому мне в первую очередь понадобились динамические таблицы и наполнение шаблонов в формате Word.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38878452
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661Только работа со строками
и не забывать про обрезку слева. и справа.

Я выложил рабочий пример, ни про что не забыл. Уже запустил его в работу в офисе. Всё отлично работает.
...
Рейтинг: 0 / 0
Помогите прочитать XML
    #38878454
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxqвнимательно прочтите http://php.net/manual/ru/simplexmlelement.children.php
у вас используется разные пространства имен, ...
Да, ладно уже обошелся без этих пространств имён. Благо XML - это обычный текст. Через поиск-замену даже проще оказалось.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите прочитать XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]