XSD到带导入的XML

本文关键字:XML 导入 XSD | 更新日期: 2023-09-27 18:27:16

我目前正在开发一种生成XML文件的服务,该服务遵循发票的UBL标准,因此我需要使用一些提供的XSD模式。

我在.NET C#中进行开发,并找到了一种可以将XSD映射到C#类的方法——通过使用XSD.exe——这似乎可以吗?

我面临的问题是,xsd文件中还有其他名称空间,这似乎给我生成的类(xsd:imports)带来了一些问题:

<!-- ===== xsd:schema Element With Namespaces Declarations ===== -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xmlns:ccts="urn:un:unece:uncefact:documentation:2"
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="2.0">
<!-- ===== Imports ===== -->
<xsd:import namespace="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" schemaLocation="../common/UBL-CommonAggregateComponents-2.0.xsd"/>
<xsd:import namespace="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" schemaLocation="../common/UBL-CommonBasicComponents-2.0.xsd"/>
<xsd:import namespace="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" schemaLocation="../common/UnqualifiedDataTypeSchemaModule-2.0.xsd"/>
<xsd:import namespace="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" schemaLocation="../common/UBL-CommonExtensionComponents-2.0.xsd"/>
<xsd:import namespace="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" schemaLocation="../common/UBL-QualifiedDatatypes-2.0.xsd"/>
<!-- ===== Root Element ===== -->
<xsd:element name="Invoice" type="InvoiceType">
...

我用以下命令运行了xsd.exe:

xsd.exe /c C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'maindoc'UBL-Invoice-2.0.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'UBL-CommonAggregateComponents-2.0.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'UBL-CommonBasicComponents-2.0.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'UnqualifiedDataTypeSchemaModule-2.0.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'UBL-CommonExtensionComponents-2.0.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'UBL-QualifiedDatatypes-2.0.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'CodeList_UnitCode_UNECE_7_04.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'CodeList_MIMEMediaTypeCode_IANA_7_04.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'CodeList_LanguageCode_ISO_7_04.xsd C:'Users'tn'Downloads'os-UBL-2.0'os-UBL-2.0'xsd'common'CodeList_CurrencyCode_ISO_7_04.xsd

当我尝试使用生成的代码制作XML文件时,输出看起来是这样的,其中缺少导入和namespaceprocedures,并且最终无法通过验证。

<?xml version="1.0" encoding="utf-8"?>
<Invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
   <UBLVersionID xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">2.0</UBLVersionID>
   <LegalMonetaryTotal xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2">
   <LineExtensionAmount currencyID="DKK" xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">200</LineExtensionAmount>
   <PayableAmount currencyID="DKK" xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">300</PayableAmount>
   </LegalMonetaryTotal>
</Invoice>

这里有一些示例代码,我通过xmlserializer 从生成的类中生成XML

XmlSerializer mySerializer = new XmlSerializer(typeof(InvoiceType));
    InvoiceType invoice = new InvoiceType();
    UBLVersionIDType UVer = new UBLVersionIDType();
    UVer.Value = "2.0";
    invoice.UBLVersionID = UVer;
    MonetaryTotalType mtt = new MonetaryTotalType();
    LineExtensionAmountType lep = new LineExtensionAmountType();
    lep.currencyID = CurrencyCodeContentType.DKK;
    lep.Value = 200;
    PayableAmountType pat = new PayableAmountType();
    pat.currencyID = CurrencyCodeContentType.DKK;
    pat.Value = 300;
    mtt.LineExtensionAmount = lep;
    mtt.PayableAmount = pat;
    invoice.LegalMonetaryTotal = mtt;
    StreamWriter sw = new StreamWriter(@"C:'New folder'test2.xml");
    mySerializer.Serialize(sw, invoice);
    sw.Close();

我该如何解决这个问题,这是在.NET中制作遵循xsd模式的XML的正确(最好/最简单)方法吗?

XSD到带导入的XML

发现了自己。

需要XmlSerializerNamespaces对象,该对象包含XML文档的命名空间和前缀。

(http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx)