我有一些XML文件需要批处理到SQL Server。以下Schema和XML部分概述了我遇到问题的一个方面。
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element name="TextLine" type="xs:string" sql:field="AdvertLine" sql:relation="XmlAdvert" sql:relationship="XmlAdvert" />
<xs:element name="BreakPoint" sql:is-constant="1" />
</xs:choice>
</xs:sequence>
</xs:complexType>
<Advert>
<AdvertText>
<TextLine>Isuzu 4 X 4TRUCKMAN</TextLine>
<BreakPoint />
<TextLine>2.0TD, Red, 5 dr, 60,000 miles, MOT, 5 SEATER</TextLine>
<BreakPoint />
<TextLine>£2500</TextLine>
<BreakPoint />
<TextLine>01234 567890</TextLine>
</AdvertText>
</Advert>
但是由于SQLXMLBulkload不支持xs:choice,我想知道是否有另一种表示方式,如果没有xs:choice部分,xs:sequence一旦到达第二个TextLine就无效。
答案 0 :(得分:0)
我不熟悉SQLXMLBulkload,但这是我的想法:
我不确定相邻的TextLine
和BreakPoint
元素之间是否存在任何关系。假设没有,那么最简单的解决方案可能是使用XSLT转换模式和数据,以消除对choice
的需求。
请注意,我已在两个元素上插入maxOccurs="unbounded"
。如果这不起作用,那么应该采用另一种方法;见下文。
<xs:complexType>
<xs:sequence>
<xs:element name="TextLine" type="xs:string" sql:field="AdvertLine" sql:relation="XmlAdvert" sql:relationship="XmlAdvert" maxOccurs="unbounded"/>
<xs:element name="BreakPoint" sql:is-constant="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
等效的XML将是:
<Advert>
<AdvertText>
<TextLine>Isuzu 4 X 4TRUCKMAN</TextLine>
<TextLine>2.0TD, Red, 5 dr, 60,000 miles, MOT, 5 SEATER</TextLine>
<TextLine>£2500</TextLine>
<TextLine>01234 567890</TextLine>
<BreakPoint />
<BreakPoint />
<BreakPoint />
</AdvertText>
</Advert>
但据我所知,SQLXMLBulkload也不会喜欢这种安排。在这种情况下,仅基于您的示例XML,我敢打赌它会接受这个:
匹配的XML为:
<Advert>
<AdvertText>
<TextLines>
<TextLine>Isuzu 4 X 4TRUCKMAN</TextLine>
<TextLine>2.0TD, Red, 5 dr, 60,000 miles, MOT, 5 SEATER</TextLine>
<TextLine>£2500</TextLine>
<TextLine>01234 567890</TextLine>
</TextLines>
<BreakPoints>
<BreakPoint />
<BreakPoint />
<BreakPoint />
</BreakPoints>
</AdvertText>
</Advert>
这仍然留下了如何编写你需要的XSLT的问题,但也许这是一个开始。