Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите прочитать XML / 23 сообщений из 23, страница 1 из 1
07.02.2015, 22:29
    #38874048
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
С данной технологией пока незнаком.
Есть такой файл (привожу только начало, т.к. большой):
Код: 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
07.02.2015, 23:08
    #38874060
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Алексей СмирновНе пойму, как получить доступ к элементам дерева.
1) прочитать документацию
2) если не помогло - просто не указывать корневой элемент, $xml - это уже и есть SimpleXMLElement w:wordDocument
...
Рейтинг: 0 / 0
08.02.2015, 09:51
    #38874110
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Изопропил1) прочитать документацию
2) если не помогло - просто не указывать корневой элемент, $xml - это уже и есть SimpleXMLElement w:wordDocument
Документацию читаю только на русском, английскую переводить некогда. В русской больше ничего не нашёл, кроме простеньких примеров. Не указывать корневой и другие элементы конечно пробывал. Бесполезно. Возиться больше не стал.
Обойдусь функциями поиском-замены текста, так проще оказалось.
...
Рейтинг: 0 / 0
08.02.2015, 10:55
    #38874119
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Алексей СмирновБесполезно.
враньё
...
Рейтинг: 0 / 0
08.02.2015, 12:05
    #38874130
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Написал несколько функции для работы с 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
08.02.2015, 12:12
    #38874131
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
гениально!

Код: php
1.
!($intDoc = strlen($strDoc))
...
Рейтинг: 0 / 0
08.02.2015, 12:16
    #38874132
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Пример использования:
Например в документе 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
08.02.2015, 12:17
    #38874133
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
FishHookгениально!

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


Ну как умею. А как надо?)
...
Рейтинг: 0 / 0
08.02.2015, 12:31
    #38874136
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Там в коде ещё использовались фунции 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
08.02.2015, 12:36
    #38874137
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Алексей СмирновЕсли кому надо, пользуйтесь
только по приговору суда.
...
Рейтинг: 0 / 0
08.02.2015, 17:02
    #38874192
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
Суровый челябинский программист. XML либы только для слабаков! Только работа со строками, только хардкор!
...
Рейтинг: 0 / 0
09.02.2015, 02:43
    #38874349
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите прочитать XML
NekZТолько работа со строками


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

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


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

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

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


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

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

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


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