xml - 如何找到 OPENXML 函数的正确路径
问题描述
我需要将 XML 文件中的某些字段提取到 SQL Server 表中,但我找不到 SQL Server 的 openxml 函数中指定的正确路径。
如何输入正确的路径(从给出的 XML 提取)来提取任何此类字段?
我想使用来自 identifer 的相关数据提取 Id 和 InternalId 字段
我已经使用 openrowset 将 XML 文档引入到 SQL Server 表中。
我也有代码尝试从 XML 中提取一个字段,但我在 openxml 函数中的路径是错误的,即它一直返回一个空白。
CREATE TABLE XMLwithOpenXML
(
Id INT IDENTITY PRIMARY KEY,
XMLData XML,
LoadedDateTime DATETIME
)
INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK 'C:\Users\ANRE\OneDrive - Ambu\Desktop\Operation Docs\XML\SinglePortalForm.xml', SINGLE_BLOB) AS x;
SELECT * FROM XMLwithOpenXML
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = XMLData FROM XMLwithOpenXML
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT Id
FROM OPENXML(@hDoc, 'Forms/PortalForm/Identifer')
WITH
(
Id [varchar](500) 'Id'
)
EXEC sp_xml_removedocument @hDoc
GO
It should be pulling Fields Id and InternalId
from the below: However I receive no error message, it just returns a blank
<Identifier>
<Id>4b68ac3d-70c7-4262-8245-c29be80f7e07</Id>
<InternalId>17</InternalId>
<IsReferenceValid>true</IsReferenceValid>
<Name>ItemMarketingMakeForm</Name>
</Identifier>
<FormFile xmlns="http//schemas.profisee.com/masterdatamaestro/2010/07" xmlnsi="http//www.w3.org/2001/XMLSchema-instance">
<AssemblyVersion>6.1.0.0</AssemblyVersion>
<ServerURL inil="true" />
<UserName>UULAN\DDFV</UserName>
<Forms xmlnsa="http//schemas.profisee.com/masterdatamaestro/2010/09">
<PortalForm>
<Identifier>
<Id>4b68ac3d-70c7-4262-8245-c29be80f7e07</Id>
<InternalId>17</InternalId>
<IsReferenceValid>true</IsReferenceValid>
<Name>ItemMarketingMakeForm</Name>
</Identifier>
<MetadataStatus>Valid</MetadataStatus>
<UpdateState>Auto</UpdateState>
<ChangeAudit>
<Created>
<DateTime>2019-05-16T071250.897</DateTime>
<UserId>
<Id>fe0ea488-c98f-4a4d-aff4-cd8aa3c51915</Id>
<InternalId>18</InternalId>
<IsReferenceValid>true</IsReferenceValid>
解决方案
这个答案比较晚,但你还没有得到任何答案......
有几件事要知道:
首先:(FROM OPENXML
与 SP 一起准备和删除文档)已过时,不应再使用。
第二:声明了一个默认命名空间(带有xmlns="SomeURL"
)。
沿着这个尝试一些东西来获得你提到的两个领域。如果您需要其他任何内容,请返回或开始一个新问题。
DECLARE @XML XML=
N'<FormFile xmlns="http//schemas.profisee.com/masterdatamaestro/2010/07" xmlnsi="http//www.w3.org/2001/XMLSchema-instance">
<AssemblyVersion>6.1.0.0</AssemblyVersion>
<ServerURL inil="true" />
<UserName>UULAN\DDFV</UserName>
<Forms xmlnsa="http//schemas.profisee.com/masterdatamaestro/2010/09">
<PortalForm>
<Identifier>
<Id>4b68ac3d-70c7-4262-8245-c29be80f7e07</Id>
<InternalId>17</InternalId>
<IsReferenceValid>true</IsReferenceValid>
<Name>ItemMarketingMakeForm</Name>
</Identifier>
<MetadataStatus>Valid</MetadataStatus>
<UpdateState>Auto</UpdateState>
<ChangeAudit>
<Created>
<DateTime>2019-05-16T071250.897</DateTime>
<UserId>
<Id>fe0ea488-c98f-4a4d-aff4-cd8aa3c51915</Id>
<InternalId>18</InternalId>
<IsReferenceValid>true</IsReferenceValid>
</UserId>
</Created>
</ChangeAudit>
</PortalForm>
</Forms>
</FormFile>';
--首先我们将声明命名空间,然后我们将使用.value()
从给定的 XPath 中检索一个值:
WITH XMLNAMESPACES(DEFAULT 'http//schemas.profisee.com/masterdatamaestro/2010/07')
SELECT @XML.value('(/FormFile/Forms/PortalForm/Identifier/Id/text())[1]','uniqueidentifier') AS Identifier_Id
,@XML.value('(/FormFile/Forms/PortalForm/Identifier/InternalId/text())[1]','int') AS Identifier_InternalId;
--如果命名空间可能发生变化,或者<Identifier>
可能位于不同的位置,您可以像这里一样最小化查询
SELECT @XML.value('(//*:Identifier/*:Id/text())[1]','uniqueidentifier') AS Identifier_Id
,@XML.value('(//*:Identifier/*:InternalId/text())[1]','int') AS Identifier_InternalId;
推荐的方法是:“尽可能具体”。
推荐阅读
- python - Python:基于数字序列拆分DataFrame
- python - 如何将numpy数组中的字典值写入csv文件而不是完整字典?
- redmine - 升级后Redmine主题无法正确显示
- java - 通过反射设置 java 类字段时出现 IllegalArgumentException
- c# - PDFClown nuget 包无法加载程序集
- google-cloud-platform - 域 SSL 不起作用,我该怎么办?
- php - 为什么我的电子邮件和数据库会出现 2 个不同的值?
- optimization - 八度:quadprog 索引问题?
- c++ - 使用带有自动声明的 lambdas 与就地?
- c# - 动态加载 XAML 控件时无法创建未知类型“画布”