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

Файл
<?xml version="1.0" encoding="utf-8" ?><Excursions>
<Excursion>
<ExcursionId>84543</ExcursionId>
<ExcursionCity>Нижний Новгород</ExcursionCity>
<ExcursionDateStart>21.05.2017</ExcursionDateStart>
<ExcursionTimeStart>09:00</ExcursionTimeStart>
<ExcursionDateEnd>21.05.2017</ExcursionDateEnd>
<ExcursionTimeEnd>09:00</ExcursionTimeEnd>
<ExcursionDescription>Регистрация на борту теплохода. Отправление теплохода в рейс.</ExcursionDescription>
</Excursion>
</Excursions>


Схема
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Excursions" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
>
  <xs:element name="Excursions" msdata:IsDataSet="true" msdata:Locale="en-US" sql:is-constant="1" >
    <xs:complexType>
     <xs:sequence>
        <xs:element name="Excursion"
                   sql:relation="[infoflot_Excursions]" 
                   sql:key-fields="ShipId TourId ExcursionId"
                   sql:overflow-field="OverflowColumn"
        >
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ExcursionId" type="xs:int" minOccurs="0" />
              <xs:element name="ExcursionCity" type="xs:string" minOccurs="0" sql:datatype="nvarchar(1024)" />
              <xs:element name="ExcursionDateStart" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)" />
              <xs:element name="ExcursionTimeStart" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)" />
              <xs:element name="ExcursionDateEnd" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)" />
              <xs:element name="ExcursionTimeEnd" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)"/>
              <xs:element name="ExcursionDescription" type="xs:string" minOccurs="0" sql:datatype="nvarchar(max)" />
            </xs:sequence>

            <xs:attribute name="ShipId"   type="xs:int"    default="-1"/>
            <xs:attribute name="TourId"   type="xs:int"    default="-1"/>

          </xs:complexType>
        </xs:element>
       </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Засада  

При попытке загрузить - вопит: "XML SAX Parser: Необъявленный объект."

Варианты, которые я надыбал
1. Ну... похерить это дело из файла. Банально и эффективно, но муторно.
2. В файле XML объявить объект <!ENTITY name "entity_value"> = <!ENTITY nbsp " ">. Но это опять ИСХОДНЫЙ файл .XML править надо.

Вдруг кто знает вариант получше?
Лучше бы через схему .XSD.
17 апр 17, 09:08    [20406537]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
Пардон, самое главное форум скушал

<ExcursionDescription>Регистрация на борту теплохода. & n b s p ; Отправление теплохода в рейс.</ExcursionDescription>

Засада в & n b s p ;
17 апр 17, 09:09    [20406541]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
felix_ff
Member

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

Это по тому что досихпор грузите преобразованные из html данные.
Сhar(160) <> char(32)

Может пора использовать SSIS?
17 апр 17, 10:05    [20406742]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
felix_ff
aleks2,

Это по тому что досихпор грузите преобразованные из html данные.
Сhar(160) <> char(32)

Может пора использовать SSIS?


Спасибо, дарагой КО.
Я вам тоже сочувствую.

ЗЫ. Я гружу то, что выгружают. Конечно, я попробую пнуть выгружателей, но вопрос не в "надо ли использовать трактор для вскопки цветочного горшка".
17 апр 17, 10:35    [20406842]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
felix_ff
Member

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

+ имхо

заблуждаешься дружище.

Под задачи импорта требующих предварительной модификации необходимо изначально использовать средства которые сокращают дальнейшие пляски с бубнами после загрузки данных.

но это чисто мое имхо, тебе видней как выкручиваться
17 апр 17, 13:06    [20407386]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
felix_ff
aleks2,

+ имхо

заблуждаешься дружище.

Под задачи импорта требующих предварительной модификации необходимо изначально использовать средства которые сокращают дальнейшие пляски с бубнами после загрузки данных.

но это чисто мое имхо, тебе видней как выкручиваться


Я раз в десять быстрее (и по времени, по окончательной скорости загрузки, по нагрузке на сервер) сделаю эту модификацию в powershell, чем разберусь и заставлю работать SSIS.

Кстати, с какой радости, SSIS проглотит невалидный XML?

ЗЫ. SSIS - это костыль для хромых на голову. Он создает впечатление "быстрее", но на практике монструозная и трудно поддерживаемая хрень.
17 апр 17, 15:38    [20408011]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
KRS544
Member

Откуда:
Сообщений: 497
aleks2
Засада в & n b s p ;

самое простое грузить как текст, потом replace.
И похоже надо еще кавычки проверять и другие спецсимволы, кроме амперсенда
17 апр 17, 16:11    [20408130]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
KRS544
Member

Откуда:
Сообщений: 497
Есть наверно еще вариант с CDATA, но сам никогда не использовал
17 апр 17, 16:13    [20408139]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
Massa52
Member

Откуда:
Сообщений: 387
aleks2
Кстати, с какой радости, SSIS проглотит невалидный XML?

Не проглотит. Пытался в Excel открыть как таблицу - парсер вывалился.
Получается - парсер везде один. Однако - html-овский пробел   не переваривается парсером. Похоже - без вмешательства в оригинальный xml - не обойтись.
18 апр 17, 03:34    [20409369]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
+
aleks2
Короче, источник данных умудряется выгрузить

Файл
<?xml version="1.0" encoding="utf-8" ?><Excursions>
<Excursion>
<ExcursionId>84543</ExcursionId>
<ExcursionCity>Нижний Новгород</ExcursionCity>
<ExcursionDateStart>21.05.2017</ExcursionDateStart>
<ExcursionTimeStart>09:00</ExcursionTimeStart>
<ExcursionDateEnd>21.05.2017</ExcursionDateEnd>
<ExcursionTimeEnd>09:00</ExcursionTimeEnd>
<ExcursionDescription>Регистрация на борту теплохода. Отправление теплохода в рейс.</ExcursionDescription>
</Excursion>
</Excursions>


Схема
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Excursions" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
>
  <xs:element name="Excursions" msdata:IsDataSet="true" msdata:Locale="en-US" sql:is-constant="1" >
    <xs:complexType>
     <xs:sequence>
        <xs:element name="Excursion"
                   sql:relation="[infoflot_Excursions]" 
                   sql:key-fields="ShipId TourId ExcursionId"
                   sql:overflow-field="OverflowColumn"
        >
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ExcursionId" type="xs:int" minOccurs="0" />
              <xs:element name="ExcursionCity" type="xs:string" minOccurs="0" sql:datatype="nvarchar(1024)" />
              <xs:element name="ExcursionDateStart" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)" />
              <xs:element name="ExcursionTimeStart" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)" />
              <xs:element name="ExcursionDateEnd" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)" />
              <xs:element name="ExcursionTimeEnd" type="xs:string" minOccurs="0" sql:datatype="nvarchar(32)"/>
              <xs:element name="ExcursionDescription" type="xs:string" minOccurs="0" sql:datatype="nvarchar(max)" />
            </xs:sequence>

            <xs:attribute name="ShipId"   type="xs:int"    default="-1"/>
            <xs:attribute name="TourId"   type="xs:int"    default="-1"/>

          </xs:complexType>
        </xs:element>
       </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Засада  

При попытке загрузить - вопит: "XML SAX Parser: Необъявленный объект."

Варианты, которые я надыбал
1. Ну... похерить это дело из файла. Банально и эффективно, но муторно.
2. В файле XML объявить объект <!ENTITY name "entity_value"> = <!ENTITY nbsp " ">. Но это опять ИСХОДНЫЙ файл .XML править надо.

Вдруг кто знает вариант получше?
Лучше бы через схему .XSD.


Проверьте, что в файле все не-ascii символы действительно закодированы в utf-8. Если нет, то надо заменить encoding="utf-8" на encoding="windows-1251".
18 апр 17, 10:16    [20409804]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
rnk
Member

Откуда:
Сообщений: 126
aleks2

Варианты, которые я надыбал
1. Ну... похерить это дело из файла. Банально и эффективно, но муторно.
2. В файле XML объявить объект <!ENTITY name "entity_value"> = <!ENTITY nbsp " ">. Но это опять ИСХОДНЫЙ файл .XML править надо.

3. Загрузить исходный файл в переменную типа NVARCHAR(MAX), заменить &nbsp; на &#xA0;, а потом преобразовать переменную к типу XML.
18 апр 17, 11:38    [20410126]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
[quot rnk]
aleks2
Варианты, которые я надыбал
1. Ну... похерить это дело из файла. Банально и эффективно, но муторно.
3. Загрузить исходный файл в переменную типа NVARCHAR(MAX), заменить &nbsp; на &#xA0;, а потом преобразовать переменную к типу XML.


Я не маюсь фигней и гружу sqlXmlBulkLoad из скрипта powershell.
В этом варианте быстрее powershell-ом похерить.

ЗЫ. Пока я пытаюсь учить программированию "выгружателей". Но оне сопротивляются...
18 апр 17, 12:18    [20410342]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
aleks2,
вдруг сработает
18 апр 17, 13:10    [20410574]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
HandKot
aleks2,
вдруг сработает


О чем это там? Я нифига не понял.

PS. Из того, что понял - вот аналог powershell. Но так я умею.

                    Write-Verbose "Конвертируем XML..."
                    $newfile = $file + ".xml"
                    $StreamWriter = [System.IO.StreamWriter] $newfile
                    [System.Web.HttpUtility]::HtmlDecode( [IO.File]::ReadAllText($file), $StreamWriter )
                    $StreamWriter.Close()
                    $StreamWriter.Dispose()
                    $file = $newfile
18 апр 17, 13:15    [20410596]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
aleks2,

 <xsl:value-of select="umbraco.library:Replace($someVariable', '&amp;nbsp; ', '')"/> instead?

о методе Replace, в свой время я его пытался использовать, но у меня не получилось по причине что версия была 1, а метод появился вроде только во 2
19 апр 17, 06:46    [20412995]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
HandKot
aleks2,

 <xsl:value-of select="umbraco.library:Replace($someVariable', '&nbsp; ', '')"/> instead?

о методе Replace, в свой время я его пытался использовать, но у меня не получилось по причине что версия была 1, а метод появился вроде только во 2


И куда это вставить надо?
19 апр 17, 07:38    [20413030]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
aleks2
HandKot
aleks2,

 <xsl:value-of select="umbraco.library:Replace($someVariable', '&nbsp; ', '')"/> instead?


о методе Replace, в свой время я его пытался использовать, но у меня не получилось по причине что версия была 1, а метод появился вроде только во 2


И куда это вставить надо?
Ну как, это для преобразования XSLT

Понятно, что это имеет смысл использовать, если бы уже делалось какое то XSLT, а так можно заменить и по другому.
19 апр 17, 10:34    [20413453]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
нафсякей,
Guest
http://xpoint.ru/know-how/XML/XSLT/CookBook/Entity
19 апр 17, 10:41    [20413485]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
нафсякей,
http://xpoint.ru/know-how/XML/XSLT/CookBook/Entity


aleks2
2. В файле XML объявить объект <!ENTITY name "entity_value"> = <!ENTITY nbsp " ">. Но это опять ИСХОДНЫЙ файл .XML править надо.


ЗЫ. Ну и, если честно, мне так и не удалось набрать магическое заклинание, шоб sqlXmlBulkLoader не ругался.
19 апр 17, 10:49    [20413507]     Ответить | Цитировать Сообщить модератору
 Re: и вечный бой с XML - покой нам только снится...  [new]
aleks2
Guest
Так - не работает

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Excursions[
  <!ENTITY nbsp " ">
]>
<Excursions>
<Excursion>
<ExcursionId>84543</ExcursionId>
<ExcursionCity>Нижний Новгород</ExcursionCity>
<ExcursionDateStart>21.05.2017</ExcursionDateStart>
<ExcursionTimeStart>09:00</ExcursionTimeStart>
<ExcursionDateEnd>21.05.2017</ExcursionDateEnd>
<ExcursionTimeEnd>09:00</ExcursionTimeEnd>
<ExcursionDescription>Регистрация на борту теплохода.& nbsp;Отправление теплохода в рейс.</ExcursionDescription>
</Excursion>
19 апр 17, 11:04    [20413555]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить