我的理解很差,所以真的需要一个地方开始寻找信息。
我有4个SQL数据表。我想将所有这些输出到XML文件。
我有一个XML Schema可以使用,但不知道如何使用它或应该使用它。
长期目标是有30个切换表,我们可以运行验证脚本,然后使用XML Scheme生成1个XML文件进行提交。
我是一名新手并且在我学习的同时学习任何建议,我将不胜感激。
示例XML数据
<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2013 rel. 2 sp2 (http://www.altova.com)-->
-<MSDS:MSDS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:MSDS="http://www.datadictionary.nhs.uk/messages/MSDS-v1-0" xsi:schemaLocation="http://www.datadictionary.nhs.uk/messages/MSDS-v1-0 ../Schemas/MSDSMSDS_XMLSchema-v1-0.xsd">
-<MATHDRHeader>
<Version>1.0</Version>
<OrgCodeProv>5BC</OrgCodeProv>
<OrgCodeSubmitter>YEA</OrgCodeSubmitter>
<RPStartDate>2013-01-01</RPStartDate>
<RPEndDate>2013-03-12</RPEndDate>
<FileCreationDateTime>2013-03-13T13:00:27</FileCreationDateTime>
<RecordCount>1</RecordCount>
-<MAT001MothersDemographics>
<LocalPatientIdMother>112552254</LocalPatientIdMother>
<OrgCodeLocalPatientIdMother>5BC</OrgCodeLocalPatientIdMother>
<OrgCodeRes>5BC</OrgCodeRes>
<NHSNumberMother>1111111111</NHSNumberMother>
<NHSNumberStatusMother>01</NHSNumberStatusMother>
<PersonBirthDateMother>1982-01-05</PersonBirthDateMother>
<Postcode>LS1 4HY</Postcode>
<EthnicCategoryMother>99</EthnicCategoryMother>
<PersonDeathDateTimeMother>1900-01-01T00:00:00</PersonDeathDateTimeMother>
-<MAT003GPPracticeRegistration>
<LocalPatientIdMother>112552254</LocalPatientIdMother>
<OrgCodeGMPMother>4RT</OrgCodeGMPMother>
<StartDateGMPRegistration>2012-01-06</StartDateGMPRegistration>
<EndDateGMPRegistration>1900-01-01</EndDateGMPRegistration>
<OrgCodeCommissioner>6TY</OrgCodeCommissioner>
</MAT003GPPracticeRegistration>
-<MAT101BookingAppointmentDetails>
<AntenatalAppDate>2013-03-01</AntenatalAppDate>
<LocalPatientIdMother>112552254</LocalPatientIdMother>
<EDDAgreed>2013-05-01</EDDAgreed>
<EDDMethodAgreed>01</EDDMethodAgreed>
<PregnancyFirstContactDate>2013-11-11</PregnancyFirstContactDate>
<PregnancyFirstContactCareProfessionalType>060</PregnancyFirstContactCareProfessionalType>
<LastMenstrualPeriodDate>2012-10-01</LastMenstrualPeriodDate>
<PhysicalDisabilityStatusIndMother>Y</PhysicalDisabilityStatusIndMother>
<FirstLanguageEnglishIndMother>Y</FirstLanguageEnglishIndMother>
<EmploymentStatusMother>04</EmploymentStatusMother>
<SupportStatusMother>Y</SupportStatusMother>
<EmploymentStatusPartner>06</EmploymentStatusPartner>
<PreviousCaesareanSections>0</PreviousCaesareanSections>
<PreviousLiveBirths>0</PreviousLiveBirths>
<PreviousStillBirths>0</PreviousStillBirths>
<PreviousLossesLessThan24Weeks>0</PreviousLossesLessThan24Weeks>
<SubstanceUseStatus>01</SubstanceUseStatus>
<SmokingStatus>03</SmokingStatus>
<CigarettesPerDay>0</CigarettesPerDay>
<AlcoholUnitsPerWeek>0</AlcoholUnitsPerWeek>
<FolicAcidSupplement>03</FolicAcidSupplement>
<MHPredictionDetectionIndMother>N</MHPredictionDetectionIndMother>
<PersonWeight>75.0</PersonWeight>
<PersonHeight>1.45</PersonHeight>
<ComplexSocialFactorsInd>N</ComplexSocialFactorsInd>
</MAT101BookingAppointmentDetails>
</MATHDRHeader>
</MSDS:MSDS>
样品XDS
<xs:complexType name="MSDSMAT001MothersDemographicsType">
<xs:sequence>
<xs:element name="LocalPatientIdMother" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>LOCAL PATIENT IDENTIFIER (MOTHER)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="OrgCodeLocalPatientIdMother" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>ORGANISATION CODE (LOCAL PATIENT IDENTIFIER (MOTHER))</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="OrgCodeRes" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>ORGANISATION CODE (RESIDENCE RESPONSIBILITY)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="NHSNumberMother" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>NHS NUMBER (MOTHER)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="NHSNumberStatusMother" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>NHS NUMBER STATUS INDICATOR CODE (MOTHER)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="PersonBirthDateMother" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>PERSON BIRTH DATE (MOTHER)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="Postcode" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>POSTCODE OF USUAL ADDRESS (MOTHER)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="EthnicCategoryMother" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>ETHNIC CATEGORY (MOTHER)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="PersonDeathDateTimeMother" type="ST" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:appinfo>PERSON DEATH DATE TIME (MOTHER)</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="MAT003GPPracticeRegistration" type="MSDSMAT003GPPracticeRegistrationType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT101BookingAppointmentDetails"
type="MSDSMAT101BookingAppointmentDetailsType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT112DatingScanProcedure" type="MSDSMAT112DatingScanProcedureType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT201BloodGroupRhesusTest" type="MSDSMAT201BloodGroupRhesusTestType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT203RubellaSusceptibilityTest"
type="MSDSMAT203RubellaSusceptibilityTestType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT205HepatitisBScreeningTest"
type="MSDSMAT205HepatitisBScreeningTestType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT210AsymptomaticBacteriuriaScreeningOffer"
type="MSDSMAT210AsymptomaticBacteriuriaScreeningOfferType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT211HaemoglobinopathyScreeningTest"
type="MSDSMAT211HaemoglobinopathyScreeningTestType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT301MaternityCarePlan" type="MSDSMAT301MaternityCarePlanType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT303DownsSyndromeScreeningTest"
type="MSDSMAT303DownsSyndromeScreeningTestType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT305FetalAnomalyScreeningTest"
type="MSDSMAT305FetalAnomalyScreeningTestType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT306AntenatalAppointment" type="MSDSMAT306AntenatalAppointmentType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT307MedicalDiag" type="MSDSMAT307MedicalDiagType" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT309MaternityObstetricDiag" type="MSDSMAT309MaternityObstetricDiagType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT310AntenatalAdmission" type="MSDSMAT310AntenatalAdmissionType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT404LabourAndDelivery" type="MSDSMAT404LabourAndDeliveryType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT408MCI" type="MSDSMAT408MCIType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="MAT501FetusOutcome" type="MSDSMAT501FetusOutcomeType" minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT502BabysDemographicsAndBirthDetails"
type="MSDSMAT502BabysDemographicsAndBirthDetailsType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT602PostpartumDischarge" type="MSDSMAT602PostpartumDischargeType"
minOccurs="0"
maxOccurs="unbounded"/>
<xs:element name="MAT603PostpartumReadmission" type="MSDSMAT603PostpartumReadmissionType"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
答案 0 :(得分:1)
看来这个太难了,因为无法在任何网站上的任何地方获得回复
好吧,我不能让这个没有受到挑战:-D
必须讨论太难 ...一个问题是,架构以及您提供的数据不完整/无效......在您尝试缩短提供的示例数据时(这很棒!)你创建了无效的样本数据...... 我必须首先投入大量时间来了解您真正想要的内容,然后设置模拟项目。
现在我们处于太难的中心:我没有时间做这个...这是你应该提供的。最好的是可重现的独立项目。请阅读How to ask a good SQL question和How to create a MCVE
SQL Server不支持内置架构检查或与架构相关的导出自动机制。因此,我在第一次评论中告诉你,T-SQL可能是错误的工具......
您没有回答是否还有其他工具/语言 ...
这段代码是一个非常简单的C#代码。它将从模式中创建数据集的内部结构,然后将给定的XML加载到此DataSet中。当XML不兼容时,这将失败。这可能是您的模式检查。
var ds = new System.Data.DataSet("TestSchema");
ds.ReadXmlSchema(@"C:\SomePath\MotherSchema.xml");
ds.ReadXml(@"C:\SomePath\MotherData.xml");
//包含在函数中的try-catch
中的上述内容可能足以检查模式
//以下代码会将数据读入字符串以检查成功(完全未经测试...)
var sb = new System.Text.StringBuilder();
foreach (var t in ds.Tables) {
var tbl = t as System.Data.DataTable;
foreach (var r in tbl.Rows) {
var rw = r as System.Data.DataRow;
foreach (var c in tbl.Columns) {
var cl = c as System.Data.DataColumn;
sb.AppendLine(string.Format("{0}.{1}: {2}",tbl.TableName,cl.ColumnName,rw[cl].ToString()));
}
}
}
var str = sb.ToString();
最后(正如我在评论中所指出的那样如果我理解正确,你根本不需要架构)我使用FOR XML PATH
完全按照方式创建XML你需要它。这与您的复杂Access遗留代码所采用的方法大致相同:只需创建正确的XML 即可。 Access解决方案是否反映任何架构?可能不是......看看我的意思?
USE master;
GO
CREATE DATABASE TestDB;
GO
USE TestDB;
GO
- 一些微小数据的小桌子。更多列只是更多 ...
CREATE TABLE MAT001MothersDemographics(ID BIGINT, Code VARCHAR(100));
INSERT INTO MAT001MothersDemographics VALUES(1111111,'1A1')
,(222222,'2B2');
CREATE TABLE MAT003GPPracticeRegistration(ID BIGINT,MotherID BIGINT,StartDate Date);
INSERT INTO MAT003GPPracticeRegistration VALUES(1,111111,{d'2001-01-01'})
,(2,222222,{d'2002-02-02'});
- 我创建了没有名称空间的内置XML,因为它们似乎只出现在最外层节点......
DECLARE @MotherID BIGINT=222222;
DECLARE @innerXML XML= --without namespaces
(
SELECT '1.0' AS [MVersion]
,'5BC' AS [OrgCodeProv]
,GETDATE() AS [FileCreationDateTime]
,(
SELECT ID AS LocalPatientIdMother
,Code AS OrgCodeLocalPatientIdMother
FROM MAT001MothersDemographics
WHERE ID=@MotherID
FOR XML PATH('MAT001MothersDemographics'),TYPE
)
,(
SELECT MotherID AS LocalPatientIdMother
,StartDate AS StartDateGMPRegistration
FROM MAT003GPPracticeRegistration
WHERE MotherID=@MotherID
FOR XML PATH('MAT003GPPracticeRegistration'),TYPE
)
FOR XML PATH('MATHDRHeader')
);
- 这将使用<MSDS:MSDS>
节点
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi
,'http://www.datadictionary.nhs.uk/messages/MSDS-v1-0' AS MSDS
,'http://www.datadictionary.nhs.uk/messages/MSDS-v1-0 ../Schemas/MSDSMSDS_XMLSchema-v1-0.xsd' AS schemaLocation)
SELECT @innerXML
FOR XML PATH('MSDS:MSDS');
- 清理
GO
USE master;
GO
DROP DATABASE TestDB;
GO
这个小部分的结果看起来非常像你需要它:
<MSDS:MSDS xmlns:schemaLocation="http://www.datadictionary.nhs.uk/messages/MSDS-v1-0 ../Schemas/MSDSMSDS_XMLSchema-v1-0.xsd" xmlns:MSDS="http://www.datadictionary.nhs.uk/messages/MSDS-v1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MATHDRHeader>
<MVersion>1.0</MVersion>
<OrgCodeProv>5BC</OrgCodeProv>
<FileCreationDateTime>2017-04-21T10:45:57.590</FileCreationDateTime>
<MAT001MothersDemographics>
<LocalPatientIdMother>222222</LocalPatientIdMother>
<OrgCodeLocalPatientIdMother>2B2</OrgCodeLocalPatientIdMother>
</MAT001MothersDemographics>
<MAT003GPPracticeRegistration>
<LocalPatientIdMother>222222</LocalPatientIdMother>
<StartDateGMPRegistration>2002-02-02</StartDateGMPRegistration>
</MAT003GPPracticeRegistration>
</MATHDRHeader>
</MSDS:MSDS>