简体   繁体   English

C#中的复杂Xml名称空间

[英]Complex Xml namespaces in c#

I am trying to create an xml with multiple namespaces in c#. 我正在尝试在c#中创建具有多个名称空间的xml。 I am using LINQ XDocument object to create xml. 我正在使用LINQ XDocument对象创建xml。 The multiple namespaces of xml are causing a lot of confusion. xml的多个名称空间引起了很多混乱。 Can anyone help me out on right direction please. 任何人都可以在正确的方向上帮助我。

<?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# Code C#代码

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

As you may be aware, a 'qualified name' in XML is made up of the namespace and the local name. 您可能已经知道,XML中的“限定名称”由名称空间和本地名称组成。 To make this easier to deal with, you include namespace declarations that prefix these namespaces. 为了使其更易于处理,您可以在名称空间声明之前添加这些名称空间。

So, for example, where you see irs:TaxYr , the qualified name is actually made up of the urn:us:gov:treasury:irs:common namespace and the TaxYr local name. 因此,例如,在看到irs:TaxYr ,限定名称实际上由urn:us:gov:treasury:irs:common命名空间和TaxYr本地名称组成。

The prefix values themselves are pretty unimportant - they're just a lookup mechanism. 前缀值本身并不重要-它们只是一种查找机制。 LINQ to XML will handle this for you automatically (by generating unique prefixes, usually p1 , p2 etc.), but you can include them as attributes yourself. LINQ to XML将自动为您处理此问题(通过生成唯一的前缀,通常是p1p2等),但是您可以自己将它们包括为属性。 To create such a declaration for the irs namespace you'd create the following attribute: 要为irs名称空间创建这样的声明,您可以创建以下属性:

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

LINQ to XML also provides some nifty implicit conversions, allowing you to create an XNamespace and qualified XName implicitly from a string. LINQ to XML还提供了一些巧妙的隐式转换,使您可以从字符串隐式创建XNamespace和限定的XName So, to get your TaxYr name you'd do the following: 因此,要获取TaxYr名称,请执行以下操作:

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

Following this all the way through for each of your elements and attributes, your XML could be created declaratively like so: 对于您的每个元素和属性,一直如此,可以声明性地创建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)
            )
        )
    );

This is how I normally do it 这是我通常的做法

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