【问题标题】:removing schema definitions from xmlelement using c#使用 c# 从 xmlelement 中删除模式定义
【发布时间】:2015-04-14 00:43:42
【问题描述】:

我正在将一个对象解析为一个 xml 文件。使用 UBL 标准。 在要序列化的类的某些部分,它接受一个 XmlElement。但是当我为这个字段设置值时。当我序列化它时,结果文件,在这部分,它再次包含模式定义,并且不考虑标签的前缀。

这是我所看到的示例:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Invoice    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:ccts="urn:un:unece:uncefact:documentation:2"
            xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
            xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
            xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
            xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
            xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ext:UBLExtensions>
        <ext:UBLExtension>
            <ext:ExtensionContent>
                <sac:AdditionalInformation>
                    <sac:AdditionalMonetaryTotal>
                        <cbc:ID>1001</cbc:ID>
                        <cbc:PayableAmount currencyID="PEN">348199.15</cbc:PayableAmount>
                    </sac:AdditionalMonetaryTotal>

但这就是我得到的:

<?xml version="1.0" encoding="iso-8859-1"?>
<Invoice    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" 
            xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" 
            xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" 
            xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1" 
            xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" 
            xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" 
            xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
    <ext:UBLExtensions>
        <ext:UBLExtension>
            <ext:ExtensionContent>
                <AdditionalInformationType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" xmlns="">
                    <sac:AdditionalProperty>
                        <sac:AdditionalPropertyType xsi:type="sac:AdditionalMonetaryTotalType">
                            <sac:ID>1001</sac:ID>
                            <sac:PayableAmount currencyID="PEN">348199.15</sac:PayableAmount>
                        </sac:AdditionalPropertyType>

这是我用来设置XmlElement 值的代码:

XmlDocument xmlDoc = new XmlDocument();
ContaNet.Ubl.v2.Sac.AdditionalInformationType addInfo = new v2.Sac.AdditionalInformationType();
addInfo.AdditionalProperty.Add(new v2.Sac.AdditionalMonetaryTotalType() { 
    ID = new v2.Cbc.IDType() { 
        Value = "1001",
    },
    PayableAmount = new v2.Cbc.PayableAmountType() {
        CurrencyID = v2.Udt.Enum.CurrencyCodeContentType.PEN,
        Value = Convert.ToDecimal(348199.15)
    }
});

using (XmlWriter xWriter = xmlDoc.CreateNavigator().AppendChild()) {
    new XmlSerializer(addInfo.GetType()).Serialize(xWriter, addInfo);
}

invoice.UBLExtensions = new List<UBLExtensionType>();
UBLExtensionType extType = new UBLExtensionType();
extType.ExtensionContent = xmlDoc.DocumentElement;
invoice.UBLExtensions.Add(extType);

删除 XmlElement 中的架构定义并强制对象使用顶部定义的架构进行序列化的最佳方法是什么。

这是我序列化对象的方式:

static void Main(string[] args) {
       InvoiceType invoice = GenerateInvoice();
       XmlWriterSettings setting = new XmlWriterSettings();
       setting.ConformanceLevel = ConformanceLevel.Auto;
       setting.Indent = true;
       setting.IndentChars = "\t";
       setting.Encoding = Encoding.GetEncoding("ISO-8859-1");
       using (XmlWriter writer = XmlWriter.Create("Invoice.xml", setting)) {
            Type typeToSerialize = typeof(InvoiceType);
            XmlSerializer xs = new XmlSerializer(typeToSerialize);
            xs.Serialize(writer, invoice);
       }
       Console.ReadLine();
 }

XmlElement 的原因是因为我可以在那里存储任何东西

【问题讨论】:

  • 如何序列化Invoice?为什么将内容存储为XmlElement?为什么不像AdditionalInformationType
  • @Yoh Deadfall 我已经更新了问题

标签: c# xml


【解决方案1】:

如果您想存储任何内容,请使用object 和以下代码:

invoice.UBLExtensions = new List<object>();
invoice.UBLExtensions.Add(addInfo);

Type typeToSerialize = typeof(InvoiceType);
Type[] extraTypes = null;

if (invoice.UBLExtensions != null)
{ extraTypes = invoice.UBLExtensions.Select((e) => e.GetType()).ToArray(); }

// Now the serializer knows all additional types
XmlSerializer xs = new XmlSerializer(typeToSerialize, extraTypes);

【讨论】:

  • 不工作.. 收到此错误:不是预期的类型 ContaNet.Ubl.v2.Ext.UBLExtensionType。使用属性 XmlInclude 或 SoapInclude 来指定静态类型。
  • 你在哪里使用UBLExtensionType类型?在我的示例中,没有UBLExtensionTypeAdditionalInformationType 直接插入invoice.UBLExtensions。如果必须使用UBLExtensionType,则将其添加到extraTypes if 语句之后。
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2019-11-05
  • 1970-01-01
  • 2017-10-17
  • 2015-08-22
相关资源
最近更新 更多