簡體   English   中英

C#中的復雜Xml名稱空間

[英]Complex Xml namespaces in c#

我正在嘗試在c#中創建具有多個名稱空間的xml。 我正在使用LINQ XDocument對象創建xml。 xml的多個名稱空間引起了很多混亂。 任何人都可以在正確的方向上幫助我。

<?xml version="1.0" encoding="UTF-8"?>
<n1:Form109495CTransmittalUpstream
xmlns="urn:us:gov:treasury:irs:ext:aca:air:6.2" xmlns:irs="urn:us:gov:treasury:irs:common"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:n1="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage"
xsi:schemaLocation="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage IRS-Form1094-1095CTransmitterUpstreamMessage.xsd">
<Form1094CUpstreamDetail recordType="String" lineNum="0">
    <SubmissionId>1</SubmissionId>
    <irs:TaxYr>1000</irs:TaxYr>
    <irs:CorrectedInd>true</irs:CorrectedInd>
 </Form1094CUpstreamDetail>
</n1:Form109495CTransmittalUpstream>

C#代碼

            new XDocument(
            new XAttribute(XNamespace.Xmlns + "version", "1.0"),
            new XAttribute(XNamespace.Xmlns + "encoding", "UTF-8"),
                new XElement("n1:Form109495CTransmittalUpstream","")
            ).Save("sample.xml");

您可能已經知道,XML中的“限定名稱”由名稱空間和本地名稱組成。 為了使其更易於處理,您可以在名稱空間聲明之前添加這些名稱空間。

因此,例如,在看到irs:TaxYr ,限定名稱實際上由urn:us:gov:treasury:irs:common命名空間和TaxYr本地名稱組成。

前綴值本身並不重要-它們只是一種查找機制。 LINQ to XML將自動為您處理此問題(通過生成唯一的前綴,通常是p1p2等),但是您可以自己將它們包括為屬性。 要為irs名稱空間創建這樣的聲明,您可以創建以下屬性:

new XAttribute(XNamespace.Xmlns + "irs", "urn:us:gov:treasury:irs:common")

LINQ to XML還提供了一些巧妙的隱式轉換,使您可以從字符串隱式創建XNamespace和限定的XName 因此,要獲取TaxYr名稱,請執行以下操作:

XNamespace irs = "urn:us:gov:treasury:irs:common";
XName taxYr = irs + "TaxYr";

對於您的每個元素和屬性,一直如此,可以聲明性地創建XML,如下所示:

XNamespace def = "urn:us:gov:treasury:irs:ext:aca:air:6.2";
XNamespace irs = "urn:us:gov:treasury:irs:common";
XNamespace n1 = "urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
var schemaHint = "urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage IRS-Form1094-1095CTransmitterUpstreamMessage.xsd";

var doc = new XDocument(
    new XElement(n1 + "Form109495CTransmittalUpstream",
        new XAttribute("xmlns", def),
        new XAttribute(XNamespace.Xmlns + "irs", irs),
        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
        new XAttribute(XNamespace.Xmlns + "n1", n1),
        new XAttribute(xsi + "schemaLocation", schemaHint),
        new XElement(def + "Form1094CUpstreamDetail",
            new XAttribute("recordType", "String"),
            new XAttribute("lineNum", 0),
            new XElement(def + "SubmissionId", 1),
            new XElement(irs + "TaxYr", 1000),
            new XElement(irs + "CorrectedInd", true)
            )
        )
    );

這是我通常的做法

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<n1:Form109495CTransmittalUpstream" +
                    " xmlns=\"urn:us:gov:treasury:irs:ext:aca:air:6.2\" xmlns:irs=\"urn:us:gov:treasury:irs:common\"" +
                    " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
                    " xmlns:n1=\"urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage\"" +
                    " xsi:schemaLocation=\"urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage IRS-Form1094-1095CTransmitterUpstreamMessage.xsd\">" +
                "</n1:Form109495CTransmittalUpstream>";

            XDocument doc = XDocument.Parse(xml);
            XElement form109495CTransmittalUpstream = (XElement)doc.FirstNode;
            XNamespace  def = form109495CTransmittalUpstream.GetDefaultNamespace();
            XNamespace irs = form109495CTransmittalUpstream.GetNamespaceOfPrefix("irs");
            XNamespace n1 = form109495CTransmittalUpstream.GetNamespaceOfPrefix("n1");

            XElement form1094CUpstreamDetail = new XElement(def + "Form1094CUpstreamDetail", new XAttribute[] {
                new XAttribute("recordType", "String"), new XAttribute("lineNum", 0)
            });
            form109495CTransmittalUpstream.Add(form1094CUpstreamDetail);

            form109495CTransmittalUpstream.Add(new XElement("SubmissionId", 1));
            form109495CTransmittalUpstream.Add(new XElement(irs + "TaxYr", 1000));
            form109495CTransmittalUpstream.Add(new XElement(irs + "CorrectedInd", true));

        }
    }
}
​

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM