Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL无法查询具有多个嵌套名称空间且没有唯一ID的XML_Sql Server_Xml_Tsql_Xml Namespaces - Fatal编程技术网

Sql server T-SQL无法查询具有多个嵌套名称空间且没有唯一ID的XML

Sql server T-SQL无法查询具有多个嵌套名称空间且没有唯一ID的XML,sql-server,xml,tsql,xml-namespaces,Sql Server,Xml,Tsql,Xml Namespaces,我需要从一个xml文件创建一个查询,该文件包含4个名称空间,但没有一个具有唯一id。例如xmlns:fb 我把它们列在下面: xmlns="http://xxx/pie/svc/frs/FindRegistration/2.0.0" xmlns="http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0" xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0" xmlns="http:

我需要从一个xml文件创建一个查询,该文件包含4个名称空间,但没有一个具有唯一id。例如xmlns:fb

我把它们列在下面:

xmlns="http://xxx/pie/svc/frs/FindRegistration/2.0.0"
xmlns="http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0"
xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0"
xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0"
如果我从文档中剥离所有名称空间(通过VisualStudio),我可以很好地检索数据,但我需要保持名称空间完整

<FindRegistrationsResponse xmlns="http://xxx/pie/svc/frs/FindRegistration/2.0.0">
    <AuditDetails xmlns="http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0">
        <QueryIdentifier xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0">8901823</QueryIdentifier>
        <PractitionerCount xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0">134140</PractitionerCount>
        <ServiceMessagesCount xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0">2</ServiceMessagesCount>
        <TotalRecordsSearched xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0">134142</TotalRecordsSearched>
        <TotalNumberOfRegistration xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0">257034</TotalNumberOfRegistration>
        <SnapshotDate xmlns="http://xxx/pie/xsd/common/CommonCoreElements/2.0.0">2018-06-29</SnapshotDate>
    </AuditDetails>
    <ProfessionNumberReplay ProfessionNumber="MED0000xxxxx" xmlns="http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0">
        <Practitioner>
            <PractitionerIdentifier xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">xxxxxxxx</PractitionerIdentifier>
            <PractitionerName NameEditDate="2010-07-03T14:14:35.377" xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">
                <NameTitle>Dr</NameTitle>
                <FamilyName>Smith</FamilyName>
                <GivenName>John</GivenName>
                <MiddleName />
            </PractitionerName>
            <Demographics xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">
                <Gender>GenderName</Gender>
            </Demographics>
            <Qualification QualificationEditDate="2016-08-10T19:35:54.067" xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">
                <QualificationTitle>Bachelor of Medicine / Bachelor of Surgery </QualificationTitle>
                <AwardingInstitution>University of xxx</AwardingInstitution>
                <CountryQualificationObtained>Country Name</CountryQualificationObtained>
                <YearOfQualification>1999</YearOfQualification>
            </Qualification>
            <Address AddressEditDate="2010-07-03T14:15:48.607" xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">
                <AustralianAddress>
                    <AustralianLocality>SUBURB NAME</AustralianLocality>
                    <AustralianPostcode>2000</AustralianPostcode>
                    <AustralianState>NSW</AustralianState>
                    <Country>Australia</Country>
                </AustralianAddress>
            </Address>
            <Profession xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">
                <ProfessionNumber>MED0000xxxxx</ProfessionNumber>
                <Profession>Medical Practitioner</Profession>
                <ProfessionStartDate>1999-05-10T00:00:00</ProfessionStartDate>
                <Registration>
                    <RecordNumber>001</RecordNumber>
                    <RegistrationType>Limited (Public Interest - Occasional Practice)</RegistrationType>
                    <RegistrationStatus>Unregistered</RegistrationStatus>
                    <RegistrationSubStatus>Withdrawn</RegistrationSubStatus>
                    <RegistrationToDate>2013-09-30T00:00:00</RegistrationToDate>
                    <InitialRegistrationDate>1965-05-10T00:00:00</InitialRegistrationDate>
                </Registration>
                <Condition ConditionEditDate="2012-10-22T14:00:10.5">
                    <ConditionType>Registration</ConditionType>
                    <ConditionDetail>text here</ConditionDetail>
                </Condition>
            </Profession>
        </Practitioner>
    </ProfessionNumberReplay>
</FindRegistrationsResponse>

您已经定义了名称空间,但在XPath中从未使用它们!另外,我强烈建议使用内置的XQuery功能,而不是传统的
OPENXML
方法

请尝试此select语句:

;WITH XMLNAMESPACES('http://xxx/pie/svc/frs/FindRegistration/2.0.0' AS root, 
                    'http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0' AS msg,
                    'http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0' AS el)
    SELECT
        ProfessionNumber = XC.value('(../@ProfessionNumber)', 'varchar(50)'),
        NameTitle = XC.value('(el:PractitionerName/el:NameTitle)[1]', 'varchar(50)'),
        GivenName = XC.value('(el:PractitionerName/el:GivenName)[1]', 'varchar(50)'),
        MiddleName = XC.value('(el:PractitionerName/el:MiddleName)[1]', 'varchar(50)'),
        FamilyName = XC.value('(el:PractitionerName/el:FamilyName)[1]', 'varchar(50)'),
        Gender = XC.value('(el:Demographics/el:Gender)[1]', 'varchar(50)')
    FROM
        @XML.nodes('/root:FindRegistrationsResponse/msg:ProfessionNumberReplay/msg:Practitioner') AS XT(XC)
这应该从XML字符串中获取所需的数据

更新:

当您输入问题中提供的XML以及此处的代码时,确实会得到以下输出:


因此,要么您没有真正使用您提供的示例XML,要么您正在使用不同的代码……

感谢select语句,但它不返回任何数据。我在这个链接中提供了一个XML结构的屏幕截图——在T-SQL中,“root”似乎是一个保留字,但更改它也不会返回任何数据。@Walkdog:我提供的代码确实适用于您在问题中显示的XML。查看我的更新。因此,我猜您正在尝试此代码的XML与您在此处发布的示例的结构(尤其是XML名称空间)不同。我很抱歉,您是对的。我试图使用已删除名称空间的XML运行该语句。该脚本在原始文件上运行得非常好。非常感谢。
;WITH XMLNAMESPACES('http://xxx/pie/svc/frs/FindRegistration/2.0.0' AS root, 
                    'http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0' AS msg,
                    'http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0' AS el)
    SELECT
        ProfessionNumber = XC.value('(../@ProfessionNumber)', 'varchar(50)'),
        NameTitle = XC.value('(el:PractitionerName/el:NameTitle)[1]', 'varchar(50)'),
        GivenName = XC.value('(el:PractitionerName/el:GivenName)[1]', 'varchar(50)'),
        MiddleName = XC.value('(el:PractitionerName/el:MiddleName)[1]', 'varchar(50)'),
        FamilyName = XC.value('(el:PractitionerName/el:FamilyName)[1]', 'varchar(50)'),
        Gender = XC.value('(el:Demographics/el:Gender)[1]', 'varchar(50)')
    FROM
        @XML.nodes('/root:FindRegistrationsResponse/msg:ProfessionNumberReplay/msg:Practitioner') AS XT(XC)