【发布时间】:2020-11-24 14:01:30
【问题描述】:
我需要将 XML 中的值解析为 SQL 列的
XML 看起来像这样
<GetCategorySpecificsResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Timestamp>2020-11-22T23:17:48.772Z</Timestamp>
<Ack>Success</Ack>
<Version>1179</Version>
<Build>E1179_CORE_API6_19296588_R1</Build>
<Recommendations>
<CategoryID>22422</CategoryID>
<NameRecommendation>
<Name>Binding</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>Cloth</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Disbound</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Fine Binding</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Hardcover</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Leather</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Loose Pages</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Unbound</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Vellum</Value>
<ValidationRules />
</ValueRecommendation>
</NameRecommendation>
<NameRecommendation>
<Name>Subject</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>Art</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Children's</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>History</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Law</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Literature</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Medicine</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Natural Science</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Philosophy</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Reference</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Religion, Bibles</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Science & Technology</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Travel</Value>
<ValidationRules />
</ValueRecommendation>
</NameRecommendation>
<NameRecommendation>
<Name>Original/Facsimile</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>Original</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Facsimile</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Unknown</Value>
<ValidationRules />
</ValueRecommendation>
</NameRecommendation>
<NameRecommendation>
<Name>Date of Publication</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>Unknown</Value>
<ValidationRules />
</ValueRecommendation>
<HelpText>Please indicate the year when the book was published (between 1454-1540)</HelpText>
</NameRecommendation>
<NameRecommendation>
<Name>Language</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>Arabic</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Bengali</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Bulgarian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Chinese</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Czech</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Danish</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Dutch</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>English</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Finnish</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>French</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>German</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Greek</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Hebrew</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Hindi/Urdu</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Hungarian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Irish</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Italian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Japanese</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Korean</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Latin</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Latvian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Lithuanian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Malay</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Norwegian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Polish</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Portuguese</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Russian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Serbian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Slovenian</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Spanish</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Swedish</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Turkish</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Vietnamese</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Welsh</Value>
<ValidationRules />
</ValueRecommendation>
</NameRecommendation>
<NameRecommendation>
<Name>Special Attributes</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>30</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>First Edition</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Illustrated</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Signed</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>With Dust Jacket</Value>
<ValidationRules />
</ValueRecommendation>
</NameRecommendation>
<NameRecommendation>
<Name>Region</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>Africa</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Antarctica</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Asia</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Australia, Oceania</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Europe</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Middle East</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>North America</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>South America</Value>
<ValidationRules />
</ValueRecommendation>
</NameRecommendation>
<NameRecommendation>
<Name>Publisher</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
</NameRecommendation>
<NameRecommendation>
<Name>Place of Publication</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
</NameRecommendation>
<NameRecommendation>
<Name>Author</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Optional</UsageConstraint>
</ValidationRules>
</NameRecommendation>
<NameRecommendation>
<Name>California Prop 65 Warning</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<AspectUsage>Instance</AspectUsage>
<MaxValueLength>800</MaxValueLength>
<UsageConstraint>Optional</UsageConstraint>
<VariationSpecifics>Disabled</VariationSpecifics>
</ValidationRules>
<HelpText>California Proposition 65 requires businesses to provide warnings to Californians about significant exposure to chemicals that cause cancer, birth defects, or other reproductive harm. Add details about the warning you want to show California buyers. We'll add a warning symbol and the word 'WARNING:' before the description you enter here, and we’ll add 'For more information go to www.P65Warnings.ca.gov' following your description.</HelpText>
</NameRecommendation>
</Recommendations>
<Recommendations>
<CategoryID>23048</CategoryID>
<NameRecommendation>
<Name>Material</Name>
<ValidationRules>
<ValueType>Text</ValueType>
<MaxValues>1</MaxValues>
<SelectionMode>FreeText</SelectionMode>
<UsageConstraint>Recommended</UsageConstraint>
</ValidationRules>
<ValueRecommendation>
<Value>Paper</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Papyrus</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Parchment</Value>
<ValidationRules />
</ValueRecommendation>
<ValueRecommendation>
<Value>Vellum</Value>
</ValueRecommendation>
</NameRecommendation>
</Recommendations>
</GetCategorySpecificsResponse>
我试过的是:
USE OPENXMLTesting
GO
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = XMLData FROM XMLwithOpenXML_2
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT Category_ID, NameRecomendation
FROM OPENXML(@hDoc, 'GetCategorySpecificsResponse/Recomendations')
WITH
(
Category_ID [varchar](100) 'Category_ID',
NameRecomendation [varchar](100) 'NameRecommendation'
)
EXEC sp_xml_removedocument @hDoc
GO
但我总是得到空桌子。由于我无法解析第一级,因此进一步获取是无稽之谈 最终解决方案将包含列。
- 类别 ID、名称推荐/名称、
- NameRecommendation/ValidationRules/SelectionMode
- NameRecommendation/ValidationRules/UsageConstraint
- NameRecommendation/ValidationRules/ValueType
- NameRecommendation/ValueRecommendation/Value
【问题讨论】:
-
sp_xml_preparedocument是一种真正解析 XML 的旧方法是 SQL Server; XQuery 至少从 SQL Server 2008(甚至可能是 2005 年)开始就可以使用。 -
您在这里的预期结果是什么?
-
@Larnu 首先是从 XML 获取所有可用的 CategoryID .. 最后的方法是获取有问题的 5 列
-
首先,您需要修复 XML;这是无效的。这就是为什么你所拥有的也不起作用。要解析 XML,它必须是有效的。例如,在上面,
GetCategorySpecificsResponse永远不会关闭。 -
@Larnu 抱歉。我只是复制了几个节点。文件超过 1.2 GB。我修复了丢失的标签
标签: sql-server xml tsql xquery sql-server-openxml