Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Парсинг XML:OPENXML  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4997
Всем добрый день.

Есть xml-файл, заливаю на сервер.

<?xml version="1.0" encoding="Windows-1251"?>
<!--Файл переноса данных UIP-->
<Фильм Русское="ИДЕАЛЬНЫЙ ГОЛОС 2" ID="4-073616">PITCH PERFECT 2
	<Кинотеатр КодПереноса="98">"5 Zvezd Birulyovo" g.Moskva
		<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015">
			<Дата Зрителей="" Сбор="">14.05.2015</Дата>
			<Дата Зрителей="" Сбор="">15.05.2015</Дата>
			<Дата Зрителей="" Сбор="">16.05.2015</Дата>
			<Дата Зрителей="" Сбор="">17.05.2015</Дата>
			<Дата Зрителей="" Сбор="">18.05.2015</Дата>
			<Дата Зрителей="" Сбор="">19.05.2015</Дата>
			<Дата Зрителей="" Сбор="">20.05.2015</Дата>
			<Дата Зрителей="" Сбор="">21.05.2015</Дата>
			<Дата Зрителей="" Сбор="">22.05.2015</Дата>
			<Дата Зрителей="" Сбор="">23.05.2015</Дата>
			<Дата Зрителей="" Сбор="">24.05.2015</Дата>
			<Дата Зрителей="" Сбор="">25.05.2015</Дата>
			<Дата Зрителей="" Сбор="">26.05.2015</Дата>
			<Дата Зрителей="" Сбор="">27.05.2015</Дата>
		</Копия>
	</Кинотеатр>
	<Кинотеатр КодПереноса="96">"5 Zvezd na Paveletckoy" g.Moskva
		<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015">
			<Дата Зрителей="" Сбор="">14.05.2015</Дата>
			<Дата Зрителей="" Сбор="">15.05.2015</Дата>
			<Дата Зрителей="" Сбор="">16.05.2015</Дата>
			<Дата Зрителей="" Сбор="">17.05.2015</Дата>
			<Дата Зрителей="" Сбор="">18.05.2015</Дата>
			<Дата Зрителей="" Сбор="">19.05.2015</Дата>
			<Дата Зрителей="" Сбор="">20.05.2015</Дата>
			<Дата Зрителей="" Сбор="">21.05.2015</Дата>
			<Дата Зрителей="" Сбор="">22.05.2015</Дата>
			<Дата Зрителей="" Сбор="">23.05.2015</Дата>
			<Дата Зрителей="" Сбор="">24.05.2015</Дата>
			<Дата Зрителей="" Сбор="">25.05.2015</Дата>
			<Дата Зрителей="" Сбор="">26.05.2015</Дата>
			<Дата Зрителей="" Сбор="">27.05.2015</Дата>
		</Копия>
	</Кинотеатр>	
</Фильм>


declare
@XmlData XML = '<?xml version="1.0" encoding="Windows-1251"?><!--Файл переноса данных UIP--><Фильм Русское="ИДЕАЛЬНЫЙ ГОЛОС 2" ID="4-073616">PITCH PERFECT 2<Кинотеатр КодПереноса="98">"5 Zvezd Birulyovo" g.Moskva<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015"><Дата Зрителей="" Сбор="">14.05.2015</Дата><Дата Зрителей="" Сбор="">15.05.2015</Дата><Дата Зрителей="" Сбор="">16.05.2015</Дата><Дата Зрителей="" Сбор="">17.05.2015</Дата><Дата Зрителей="" Сбор="">18.05.2015</Дата><Дата Зрителей="" Сбор="">19.05.2015</Дата><Дата Зрителей="" Сбор="">20.05.2015</Дата><Дата Зрителей="" Сбор="">21.05.2015</Дата><Дата Зрителей="" Сбор="">22.05.2015</Дата><Дата Зрителей="" Сбор="">23.05.2015</Дата><Дата Зрителей="" Сбор="">24.05.2015</Дата><Дата Зрителей="" Сбор="">25.05.2015</Дата><Дата Зрителей="" Сбор="">26.05.2015</Дата><Дата Зрителей="" Сбор="">27.05.2015</Дата></Копия></Кинотеатр><Кинотеатр КодПереноса="96">"5 Zvezd na Paveletckoy" g.Moskva<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015"><Дата Зрителей="" Сбор="">14.05.2015</Дата><Дата Зрителей="" Сбор="">15.05.2015</Дата><Дата Зрителей="" Сбор="">16.05.2015</Дата><Дата Зрителей="" Сбор="">17.05.2015</Дата><Дата Зрителей="" Сбор="">18.05.2015</Дата><Дата Зрителей="" Сбор="">19.05.2015</Дата><Дата Зрителей="" Сбор="">20.05.2015</Дата><Дата Зрителей="" Сбор="">21.05.2015</Дата><Дата Зрителей="" Сбор="">22.05.2015</Дата><Дата Зрителей="" Сбор="">23.05.2015</Дата><Дата Зрителей="" Сбор="">24.05.2015</Дата><Дата Зрителей="" Сбор="">25.05.2015</Дата><Дата Зрителей="" Сбор="">26.05.2015</Дата><Дата Зрителей="" Сбор="">27.05.2015</Дата></Копия></Кинотеатр></Фильм>'

DECLARE
		@idoc int
	EXEC sp_xml_preparedocument @idoc OUTPUT, @XmlData
	
SELECT 
		t.*	
	FROM OPENXML (@idoc, '/Фильм/Кинотеатр/Копия/Дата',2) 
		WITH ([КодПереноса] INT '../../@КодПереноса',
			[Кинотеатр] VARCHAR(255) '../../Кинотеатр',
			[Видеоформат] VARCHAR(255) '../@Видеоформат', 
			[Дата] VARCHAR(50) 'text()') t



Результат:
КодПереноса	Кинотеатр	Видеоформат	Дата
98	NULL	Цифровая дублированная	14.05.2015
98	NULL	Цифровая дублированная	15.05.2015
98	NULL	Цифровая дублированная	16.05.2015
98	NULL	Цифровая дублированная	17.05.2015
98	NULL	Цифровая дублированная	18.05.2015
98	NULL	Цифровая дублированная	19.05.2015
98	NULL	Цифровая дублированная	20.05.2015
98	NULL	Цифровая дублированная	21.05.2015
98	NULL	Цифровая дублированная	22.05.2015
98	NULL	Цифровая дублированная	23.05.2015
98	NULL	Цифровая дублированная	24.05.2015
98	NULL	Цифровая дублированная	25.05.2015
98	NULL	Цифровая дублированная	26.05.2015
98	NULL	Цифровая дублированная	27.05.2015
96	NULL	Цифровая дублированная	14.05.2015
96	NULL	Цифровая дублированная	15.05.2015
96	NULL	Цифровая дублированная	16.05.2015
96	NULL	Цифровая дублированная	17.05.2015
96	NULL	Цифровая дублированная	18.05.2015
96	NULL	Цифровая дублированная	19.05.2015
96	NULL	Цифровая дублированная	20.05.2015
96	NULL	Цифровая дублированная	21.05.2015
96	NULL	Цифровая дублированная	22.05.2015
96	NULL	Цифровая дублированная	23.05.2015
96	NULL	Цифровая дублированная	24.05.2015
96	NULL	Цифровая дублированная	25.05.2015
96	NULL	Цифровая дублированная	26.05.2015
96	NULL	Цифровая дублированная	27.05.2015


Проблема в получении данных колонки Кинотеатр: "5 Zvezd Birulyovo" g.Moskva, "5 Zvezd na Paveletckoy" g.Moskva. Что не так в коде ColPattern='../../Кинотеатр'? Сделал по аналогии с примерами из BOL. С атрибутами получилось, с элементом нет.

Если выбрать данные так:
DECLARE
		@idoc int
	EXEC sp_xml_preparedocument @idoc OUTPUT, @XmlData
	
SELECT 
		t.*	
	FROM OPENXML (@idoc, '/Фильм/Кинотеатр/Копия',2) 
		WITH ([КодПереноса] INT '../@КодПереноса',
			[Кинотеатр] VARCHAR(255) '../../Кинотеатр',
			[Видеоформат] VARCHAR(255) '@Видеоформат', 
			[Дата] VARCHAR(50) 'text()') t


То результат будет такой:
КодПереноса	Кинотеатр	Видеоформат	Дата
98	"5 Zvezd Birulyovo" g.Moskva14.05.201515.05.201516.05.201517.05.201518.05.201519.05.201520.05.201521.05.201522.05.201523.05.201524.05.201525.05.201526.05.201527.05.2015	Цифровая дублированная	NULL
96	"5 Zvezd Birulyovo" g.Moskva14.05.201515.05.201516.05.201517.05.201518.05.201519.05.201520.05.201521.05.201522.05.201523.05.201524.05.201525.05.201526.05.201527.05.2015	Цифровая дублированная	NULL


Т.е. получается, что в [Кинотеатр] попало все содержание, в том числе и подчиненных тэгов.

Вопросы:
1) Как в 1м варианте получить значение элемента "Кинотеатр"?
2) Можно ли получить это значение без содержания вложенных тэгов?

з.ы. Получаю файл на клиенте. Есть возможность там разобрать файл и залить линейный xml, но хотелось бы избавиться от лишних действий на клиенте, в том числе из-за скорости обработки.

Проходя мимо разложенных граблей, ты теряешь драгоценный опыт. (с)
18 май 15, 12:32    [17654804]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML:OPENXML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
SELECT 
		t.*	
	FROM OPENXML (@idoc, '/Фильм/Кинотеатр/Копия/Дата',2) 
		WITH ([КодПереноса] INT '../../@КодПереноса',
			[Кинотеатр] VARCHAR(255) '../../text()',
			[Видеоформат] VARCHAR(255) '../@Видеоформат', 
			[Дата] VARCHAR(50) 'text()') t
18 май 15, 12:46    [17654883]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML:OPENXML  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4997
Так, с 1м вопросом разобрался :)

SELECT 
		t.*
	FROM OPENXML (@idoc, '/Фильм/Кинотеатр/Копия/Дата',2) 
		WITH ([КодПереноса] INT '../../@КодПереноса',
			[Кинотеатр] VARCHAR(255) '../../../Кинотеатр',
			[Видеоформат] VARCHAR(255) '../@Видеоформат', 
			[Дата] VARCHAR(50) 'text()') t


А вот со вторым пока туго...
18 май 15, 12:46    [17654884]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML:OPENXML  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4997
invm
SELECT 
		t.*	
	FROM OPENXML (@idoc, '/Фильм/Кинотеатр/Копия/Дата',2) 
		WITH ([КодПереноса] INT '../../@КодПереноса',
			[Кинотеатр] VARCHAR(255) '../../text()',
			[Видеоформат] VARCHAR(255) '../@Видеоформат', 
			[Дата] VARCHAR(50) 'text()') t


Благодарю :) Вопрос закрыт
18 май 15, 12:47    [17654891]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML:OPENXML  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Megabyte,

чота сама структура xml некомильфо,
у вас блок
PITCH PERFECT 2
.....


воспринимается как text()

соотвественно парсер элементы какие вы хотите передать как xml воспринимает обычным string


Если xml будет выглядеть так
'<?xml version="1.0" encoding="Windows-1251"?>
<!--Файл переноса данных UIP-->
<Фильм Русское="ИДЕАЛЬНЫЙ ГОЛОС 2" ID="4-073616">
     <Значение>PITCH PERFECT 2</Значение>
	<Кинотеатр КодПереноса="98">
	     <Наименование>"5 Zvezd Birulyovo" g.Moskva</Наименование>
		<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015">
			<Дата Зрителей="" Сбор="">14.05.2015</Дата>
			<Дата Зрителей="" Сбор="">15.05.2015</Дата>
			<Дата Зрителей="" Сбор="">16.05.2015</Дата>
			<Дата Зрителей="" Сбор="">17.05.2015</Дата>
			<Дата Зрителей="" Сбор="">18.05.2015</Дата>
			<Дата Зрителей="" Сбор="">19.05.2015</Дата>
			<Дата Зрителей="" Сбор="">20.05.2015</Дата>
			<Дата Зрителей="" Сбор="">21.05.2015</Дата>
			<Дата Зрителей="" Сбор="">22.05.2015</Дата>
			<Дата Зрителей="" Сбор="">23.05.2015</Дата>
			<Дата Зрителей="" Сбор="">24.05.2015</Дата>
			<Дата Зрителей="" Сбор="">25.05.2015</Дата>
			<Дата Зрителей="" Сбор="">26.05.2015</Дата>
			<Дата Зрителей="" Сбор="">27.05.2015</Дата>
		</Копия>
	</Кинотеатр>
	<Кинотеатр КодПереноса="96">
	     <Наименование>"5 Zvezd na Paveletckoy" g.Moskva</Наименование>
		<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015">
			<Дата Зрителей="" Сбор="">14.05.2015</Дата>
			<Дата Зрителей="" Сбор="">15.05.2015</Дата>
			<Дата Зрителей="" Сбор="">16.05.2015</Дата>
			<Дата Зрителей="" Сбор="">17.05.2015</Дата>
			<Дата Зрителей="" Сбор="">18.05.2015</Дата>
			<Дата Зрителей="" Сбор="">19.05.2015</Дата>
			<Дата Зрителей="" Сбор="">20.05.2015</Дата>
			<Дата Зрителей="" Сбор="">21.05.2015</Дата>
			<Дата Зрителей="" Сбор="">22.05.2015</Дата>
			<Дата Зрителей="" Сбор="">23.05.2015</Дата>
			<Дата Зрителей="" Сбор="">24.05.2015</Дата>
			<Дата Зрителей="" Сбор="">25.05.2015</Дата>
			<Дата Зрителей="" Сбор="">26.05.2015</Дата>
			<Дата Зрителей="" Сбор="">27.05.2015</Дата>
		</Копия>
	</Кинотеатр>	
</Фильм>'

у вас отлично все отпарсится
18 май 15, 12:53    [17654936]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML:OPENXML  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4997
felix_ff
Megabyte,

чота сама структура xml некомильфо,
у вас блок
PITCH PERFECT 2
.....


воспринимается как text()

соотвественно парсер элементы какие вы хотите передать как xml воспринимает обычным string


Если xml будет выглядеть так
'<?xml version="1.0" encoding="Windows-1251"?>
<!--Файл переноса данных UIP-->
<Фильм Русское="ИДЕАЛЬНЫЙ ГОЛОС 2" ID="4-073616">
     <Значение>PITCH PERFECT 2</Значение>
	<Кинотеатр КодПереноса="98">
	     <Наименование>"5 Zvezd Birulyovo" g.Moskva</Наименование>
		<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015">
			<Дата Зрителей="" Сбор="">14.05.2015</Дата>
			<Дата Зрителей="" Сбор="">15.05.2015</Дата>
			<Дата Зрителей="" Сбор="">16.05.2015</Дата>
			<Дата Зрителей="" Сбор="">17.05.2015</Дата>
			<Дата Зрителей="" Сбор="">18.05.2015</Дата>
			<Дата Зрителей="" Сбор="">19.05.2015</Дата>
			<Дата Зрителей="" Сбор="">20.05.2015</Дата>
			<Дата Зрителей="" Сбор="">21.05.2015</Дата>
			<Дата Зрителей="" Сбор="">22.05.2015</Дата>
			<Дата Зрителей="" Сбор="">23.05.2015</Дата>
			<Дата Зрителей="" Сбор="">24.05.2015</Дата>
			<Дата Зрителей="" Сбор="">25.05.2015</Дата>
			<Дата Зрителей="" Сбор="">26.05.2015</Дата>
			<Дата Зрителей="" Сбор="">27.05.2015</Дата>
		</Копия>
	</Кинотеатр>
	<Кинотеатр КодПереноса="96">
	     <Наименование>"5 Zvezd na Paveletckoy" g.Moskva</Наименование>
		<Копия Видеоформат="Цифровая дублированная" Начало="14.05.2015" Окончание="27.05.2015">
			<Дата Зрителей="" Сбор="">14.05.2015</Дата>
			<Дата Зрителей="" Сбор="">15.05.2015</Дата>
			<Дата Зрителей="" Сбор="">16.05.2015</Дата>
			<Дата Зрителей="" Сбор="">17.05.2015</Дата>
			<Дата Зрителей="" Сбор="">18.05.2015</Дата>
			<Дата Зрителей="" Сбор="">19.05.2015</Дата>
			<Дата Зрителей="" Сбор="">20.05.2015</Дата>
			<Дата Зрителей="" Сбор="">21.05.2015</Дата>
			<Дата Зрителей="" Сбор="">22.05.2015</Дата>
			<Дата Зрителей="" Сбор="">23.05.2015</Дата>
			<Дата Зрителей="" Сбор="">24.05.2015</Дата>
			<Дата Зрителей="" Сбор="">25.05.2015</Дата>
			<Дата Зрителей="" Сбор="">26.05.2015</Дата>
			<Дата Зрителей="" Сбор="">27.05.2015</Дата>
		</Копия>
	</Кинотеатр>	
</Фильм>'

у вас отлично все отпарсится

Ну решение мне уже подсказали, а структура не моя. Что заказчик прислал. :)

Сейчас на клиенте старый разбор xml + построковая заливка данных. Переношу разбор на сервер для ускорения загрузки.
18 май 15, 13:12    [17655090]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить