我有一个 json,我想为电子发票创建特定的 XML 格式。
{
"invoice": {
"issuer": {
"vatNumber": "888888888",
"country": "GR",
"branch": "1"
},
"counterpart": {
"vatNumber": "999999999",
"country": "GR",
"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",
"vatCategory": "1",
"vatAmount": "120.00",
"discountOption": "true",
"incomeClassification": {
"classificationType": "E3_561_001",
"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",
"classificationCategory": "category1_2",
"amount": "1000.00"
},
{
"classificationType": "E3_561_001",
"classificationCategory": "category1_3",
"amount": "500.00"
}
]
}
}
}
你能帮我找到实现这一目标的最佳解决方案吗?我正在使用 .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>
答案 0 :(得分:0)
命名空间很棘手。所以我喜欢解析字符串,这比在代码中尝试更容易。这是使用 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);
}
}
}
答案 1 :(得分:0)
您可以使用 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>