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

Откуда:
Сообщений: 51
Привет!
Подскажите пожалуйста как обойти -

Пытаюсь загрузить xml файл, делаю как описано вот тут -

https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=136728&pg=-1&hl=loadxmlfromfile


XML вот такого вида -
<?xml version="1.0" encoding="windows-1251" ?> 
- <Заказ>
  <НомерДок>Номер заказа: 56784</НомерДок> 
  <Автор>Автор: Ивлева Елена Александровна</Автор> 
  <ДатаВремяЗаказа>Дата и время заказа: 05.08.2005 09:00</ДатаВремяЗаказа> 
</Заказ>

Запрос такой -

declare @xmlString varchar(8000)
declare @url varchar(255)


select @url = 'c:\temp\report.xml'

exec LoadXMLFromFile 
	@url, 
	@xmlString output

declare @h int

exec sp_xml_preparedocument  @h output, @xmlString
select * from openxml 
(@h, '//Заказ')
with 
(
	НомерДок varchar(10) 'НомерДок'
)

Ошибку выдает следующую -
XML parsing error: An Invalid character was found in text content.

Причем происходит это, только если в xml есть русские буквы.
Как исправить это дело?
4 авг 05, 16:06    [1764322]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
Кекс
Guest
declare @xmlString varchar(8000)
select @xmlString = '

<?xml version="1.0" encoding="windows-1251" ?> 
  <Заказ>
  <НомерДок>Номер заказа: 56784</НомерДок> 
  <Автор>Автор: Ивлева Елена Александровна</Автор> 
  <ДатаВремяЗаказа>Дата и время заказа: 05.08.2005 09:00</ДатаВремяЗаказа> 
</Заказ>
'

declare @h int

exec sp_xml_preparedocument  @h output, @xmlString
select * from openxml 
(@h, '//Заказ')
with 
(
	НомерДок varchar(1000) 'НомерДок'
)

работает. Может беда в LoadXMLFromFile? Исходник покажите, плз.
4 авг 05, 16:15    [1764382]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
беда в левом минусе
4 авг 05, 16:16    [1764387]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
Кекс
Guest
 SELECT SERVERPROPERTY('Collation') 
Cyrillic_General_CI_AS

  SELECT @@VERSION 


Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c)
1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: )
4 авг 05, 16:19    [1764400]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
CREATE PROCEDURE LoadXMLFromFile
(
	@tcFileName		VARCHAR(255),
	@tcXMLString	VARCHAR(8000) OUTPUT
) AS
BEGIN
	-- Scratch variables used in the script
	DECLARE @retVal INT
	DECLARE @oXML INT
	DECLARE @errorSource VARCHAR(8000)
	DECLARE @errorDescription VARCHAR(8000)
	DECLARE @loadRetVal INT

	-- Initialize the XML document
	EXEC @retVal = sp_OACreate 'MSXML2.DOMDocument', @oXML OUTPUT
	IF (@retVal <> 0)
	BEGIN
		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	EXEC @retVal = sp_OASetProperty @oXML, 'async', 0
	IF @retVal <> 0
	BEGIN
 		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	-- Load the XML into the document
	EXEC @retVal = sp_OAMethod @oXML, 'load', @loadRetVal OUTPUT, @tcFileName
	IF (@retVal <> 0)
	BEGIN
		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	-- Get the loaded XML
	EXEC @retVal = sp_OAMethod @oXML, 'xml', @tcXMLString OUTPUT
	IF (@retVal <> 0)
	BEGIN
		-- Trap errors if any
		EXEC sp_OAGetErrorInfo @oXML, @errorSource OUTPUT, @errorDescription OUTPUT
		RAISERROR (@errorDescription, 16, 1)

		-- Release the reference to the COM object
		EXEC sp_OADestroy @oXML
		RETURN
	END

	-- Release the reference to the COM object
	EXEC sp_OADestroy @oXML

END
4 авг 05, 16:25    [1764455]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
а куда деть минус?
4 авг 05, 16:27    [1764468]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
мои -

Cyrillic_General_CI_AS


Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 2)
4 авг 05, 16:28    [1764478]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
>а куда деть минус?<

удавить
4 авг 05, 16:35    [1764526]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
:( а как?
4 авг 05, 17:30    [1764877]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
Кекс
Guest
НовичекIB,

У Вас некорректный XML изначально - стоит минус перед словом <Заказ>
(из IE копировали небось). Уберите его из XML файла и попробуйте еще раз.

Кекс
4 авг 05, 17:54    [1765020]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
да, из експлорера, моя ошибка, минус не увидел.
Но ведь xml - грузится из файла в скрипте... и проблема возникает именно когда файл подгружается
4 авг 05, 17:59    [1765040]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
смотрю что в переменной @xmlString -

<?xml version="1.0"?> <Заказ> <НомерДок>Номер заказа: 886649</НомерДок> <Автор>Автор: Муромец Юлия</Автор> <ДатаВремяЗаказа>Дата и время заказа: 04.08.2005 17:20</ДатаВремяЗаказа> <ТелефонЗаказчика>Телефон заказчика: 987205025</ТелефонЗаказчика>


а где все остальное??? вот в чем дело... xml файл не велформед получается
4 авг 05, 18:18    [1765125]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
Предположил, что файл больше чем 8000.... сократил.... ситуация таже самая...
Помогает только если все теги и информацию в xml-файле переписать по английски....

что же делать то?
4 авг 05, 18:31    [1765181]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
НовичекIB
что же делать то?

вернуть на место информацию о кодировке
declare @xmlString varchar(8000)
declare @url varchar(255)


select @url = 'c:\temp\report.xml'

exec LoadXMLFromFile 
	@url, 
	@xmlString output
set @xmlString = replace(@xmlString ,'<?xml version="1.0"?>','<?xml version="1.0" encoding="windows-1251"?>')

declare @h int

exec sp_xml_preparedocument  @h output, @xmlString
select * from openxml 
(@h, '//Заказ')
with 
(
	НомерДок varchar(10) 'НомерДок'
)

5 авг 05, 06:43    [1765719]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Да ни причем здесь информация о кодировке. Вот как этот XML был изготовлен - это да, поди сохранен как текстовый файл в ANSI кодировке, надо бы в Unicode.
5 авг 05, 06:51    [1765725]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
для ANSI как раз и помогает
так как процедурка LoadXMLFromFile обрезает информацию о кодировке
которая изначально была у него в XML
5 авг 05, 06:58    [1765732]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
а для Unicode не сработает пока процедуру LoadXMLFromFile не проапдейтит
на nvarchar(4000)
правда еще в два раза потеряет длину файла
5 авг 05, 07:08    [1765735]     Ответить | Цитировать Сообщить модератору
 Re: загрузка русского xml  [new]
НовичекIB
Member

Откуда:
Сообщений: 51
УРА!!! Заработало!!! ну какие же вы умные!!!Спасибо огромное!
Добавил информацию о кодировке и изменил на nvarchar(4000)
5 авг 05, 11:09    [1766428]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить