微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有命名空间和前缀的 Json 到 XML

如何解决带有命名空间和前缀的 Json 到 XML

我有一个 json,我想为电子发票创建特定的 XML 格式。

{
   "invoice": {
      "issuer": {
         "vatNumber": "888888888","country": "GR","branch": "1"
      },"counterpart": {
         "vatNumber": "999999999","branch": "0","address": {
            "postalCode": "12345","city": "TEST"
         }
      },"invoiceHeader": {
         "series": "A","aa": "101","issueDate": "2021-04-27","invoiceType": "1.1","currency": "EUR"
      },"paymentMethods": {
         "paymentMethodDetails": {
            "type": "3","amount": "1760.00","paymentMethodInfo": "Payment Method Info..."
         }
      },"invoiceDetails": [
         {
            "lineNumber": "1","netValue": "1000.00","vatCategory": "1","vatAmount": "240.00","discountOption": "true","incomeClassification": {
               "classificationType": "E3_561_001","classificationCategory": "category1_2","amount": "1000.00"
            }
         },{
            "lineNumber": "2","netValue": "500.00","vatAmount": "120.00","classificationCategory": "category1_3","amount": "500.00"
            }
         }
      ],"taxesTotals": {
         "taxes": {
            "taxType": "1","taxCategory": "2","underlyingValue": "500.00","taxAmount": "100.00"
         }
      },"invoiceSummary": {
         "totalNetValue": "1500.00","totalVatAmount": "360.00","totalWithheldamount": "100.00","totalFeesAmount": "0.00","totalStampDutyAmount": "0.00","totalOtherTaxesAmount": "0.00","totalDeductionsAmount": "0.00","totalGrossValue": "1760.00","incomeClassification": [
            {
               "classificationType": "E3_561_001","amount": "1000.00"
            },{
               "classificationType": "E3_561_001","amount": "500.00"
            }
         ]
      }
   }
}

https://www.aade.gr/sites/default/files/2020-09/SampleXML_1.1_taxes_per_invoice%20%28%CE%A4%CE%99%CE%9C-%CE%A0%CE%A9%CE%9B%CE%97%CE%A3%CE%97%CE%A3%29.xml

你能帮我找到实现这一目标的最佳解决方案吗?我正在使用 .net core 3.1

我现在的问题是命名空间和前缀

<Invoicesdoc xmlns="http://www.aade.gr/myDATA/invoice/v1.0"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.aade.gr/myDATA/invoice/v1.0/Invoicesdoc-v0.6.xsd"   
        xmlns:icls="https://www.aade.gr/myDATA/incomeClassificaton/v1.0"
        xmlns:ecls="https://www.aade.gr/myDATA/expensesClassificaton/v1.0">

...

<incomeClassification>
                <icls:classificationType>E3_561_001</icls:classificationType>
                <icls:classificationCategory>category1_2</icls:classificationCategory>
                <icls:amount>1000.00</icls:amount>               
</incomeClassification>

解决方法

命名空间很棘手。所以我喜欢解析字符串,这比在代码中尝试更容易。这是使用 xml linq 的示例:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
         static void Main(string[] args)
        {
             string ident = 
                 "<InvoicesDoc xmlns=\"http://www.aade.gr/myDATA/invoice/v1.0\"" +  
                 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
                 " xmlns:icls=\"https://www.aade.gr/myDATA/incomeClassificaton/v1.0\"" +
                 " xmlns:ecls=\"https://www.aade.gr/myDATA/expensesClassificaton/v1.0\"" +
                 " xsi:schemaLocation=\"http://www.aade.gr/myDATA/invoice/v1.0/InvoicesDoc-v0.6.xsd\">" +
                 "</InvoicesDoc>";

             XDocument doc = XDocument.Parse(ident);
             XElement invoicesDoc = doc.Root;
             XNamespace ns = invoicesDoc.GetDefaultNamespace();
             XNamespace nsIcls = invoicesDoc.GetNamespaceOfPrefix("icls");
             XNamespace nsEcls = invoicesDoc.GetNamespaceOfPrefix("ecls");
             XElement invoice = new XElement(ns + "invoice");
             invoicesDoc.Add(invoice);

             XElement incomeClassification = new XElement(ns + "incomeClassification",new object[] {
                 new XElement(nsIcls + "classificationType","E3_561_001"),new XElement(nsIcls + "classificationCategory","category1_2"),new XElement(nsIcls + "amount",1000.00),});
             invoice.Add(incomeClassification);

        }
    }
  
}
,

您可以使用 XSLT 3.0,如下所示:

    <xsl:template name="xsl:initial-template">
      <xsl:variable name="in" select="json-doc('input-json.json')"/>
      <InvoicesDoc xmlns="http://www.aade.gr/myDATA/invoice/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.aade.gr/myDATA/invoice/v1.0/InvoicesDoc-v0.6.xsd"   
            xmlns:icls="https://www.aade.gr/myDATA/incomeClassificaton/v1.0"
            xmlns:ecls="https://www.aade.gr/myDATA/expensesClassificaton/v1.0">
         <xsl:for-each select="$in?invoices?invoiceDetails?*">
           <incomeClassification>
             <icls:classificationType>{?incomeClassification?classificationType}</icls:classificationType>                           
             <icls:classificationCategory>{?incomeClassification?classificationCategory}</icls:classificationCategory>
             <icls:amount>{?incomeClassification?amount}</icls:amount>               
           </incomeClassification>
         </xsl:for-each>
      </InvoicesDoc>
    </xsl:template>
     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。