XSD 到 XML 的导入
Posted
技术标签:
【中文标题】XSD 到 XML 的导入【英文标题】:XSD to XML with imports 【发布时间】:2012-03-26 10:12:28 【问题描述】:我目前正在开发一个生成 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 文件时,输出如下所示,其中缺少导入和命名空间前驱,最终导致验证失败。
<?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 的正确(最好/最简单(最好/最简单的方法吗?
【问题讨论】:
【参考方案1】:发现自己。
需要包含 XML 文档的命名空间和前缀的 XmlSerializerNamespaces 对象。
(http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx)
【讨论】:
您是如何让 cbc: etc 命名空间先行出现的。您是否必须修改从 UBL XSD 输出的 c# 类?或者只是序列化时的不同... @JamesReategui 你找到问题的答案了吗?以上是关于XSD 到 XML 的导入的主要内容,如果未能解决你的问题,请参考以下文章
XSD 包含导入的 xsd 时的 Delphi XE2 XML 数据绑定向导错误