C# c语言中的复杂Xml名称空间#

C# c语言中的复杂Xml名称空间#,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我正在尝试用c#创建一个具有多个名称空间的xml。 我正在使用LINQXDocument对象创建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:ir

我正在尝试用c#创建一个具有多个名称空间的xml。 我正在使用LINQXDocument对象创建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>

您可能知道,XML中的“限定名称”由名称空间和本地名称组成。为了使这一点更容易处理,您包括了在这些名称空间前面加前缀的名称空间声明

例如,在您看到的
irs:TaxYr
中,限定名称实际上由
urn:us:gov:treasury:irs:common
名称空间和
TaxYr
本地名称组成

前缀值本身并不重要——它们只是一种查找机制。LINQ to XML将自动为您处理此问题(通过生成唯一的前缀,通常是
p1
p2
等),但您可以自己将它们作为属性包含。要为
irs
名称空间创建这样的声明,您需要创建以下属性:

new XAttribute(XNamespace.Xmlns + "irs", "urn:us:gov:treasury:irs:common")
LINQ到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)
            )
        )
    );

您可能知道,XML中的“限定名称”由名称空间和本地名称组成。为了使这一点更容易处理,您包括了在这些名称空间前面加前缀的名称空间声明

例如,在您看到的
irs:TaxYr
中,限定名称实际上由
urn:us:gov:treasury:irs:common
名称空间和
TaxYr
本地名称组成

前缀值本身并不重要——它们只是一种查找机制。LINQ to XML将自动为您处理此问题(通过生成唯一的前缀,通常是
p1
p2
等),但您可以自己将它们作为属性包含。要为
irs
名称空间创建这样的声明,您需要创建以下属性:

new XAttribute(XNamespace.Xmlns + "irs", "urn:us:gov:treasury:irs:common")
LINQ到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)
            )
        )
    );

您可能知道,XML中的“限定名称”由名称空间和本地名称组成。为了使这一点更容易处理,您包括了在这些名称空间前面加前缀的名称空间声明

例如,在您看到的
irs:TaxYr
中,限定名称实际上由
urn:us:gov:treasury:irs:common
名称空间和
TaxYr
本地名称组成

前缀值本身并不重要——它们只是一种查找机制。LINQ to XML将自动为您处理此问题(通过生成唯一的前缀,通常是
p1
p2
等),但您可以自己将它们作为属性包含。要为
irs
名称空间创建这样的声明,您需要创建以下属性:

new XAttribute(XNamespace.Xmlns + "irs", "urn:us:gov:treasury:irs:common")
LINQ到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)
            )
        )
    );

您可能知道,XML中的“限定名称”由名称空间和本地名称组成。为了使这一点更容易处理,您包括了在这些名称空间前面加前缀的名称空间声明

例如,在您看到的
irs:TaxYr
中,限定名称实际上由
urn:us:gov:treasury:irs:common
名称空间和
TaxYr
本地名称组成

前缀值本身并不重要——它们只是一种查找机制。LINQ to XML将自动为您处理此问题(通过生成唯一的前缀,通常是
p1
p2
等),但您可以自己将它们作为属性包含。要为
irs
名称空间创建这样的声明,您需要创建以下属性:

new XAttribute(XNamespace.Xmlns + "irs", "urn:us:gov:treasury:irs:common")
LINQ到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));

        }
    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串xml=
"" +
"" +
"";
XDocument doc=XDocument.Parse(xml);
XElement Form109495TransmittalUpStream=(XElement)doc.FirstNode;
XNamespace def=Form109495TransmittalUpStream.GetDefaultNamespace();
XNamespace irs=Form109495TransmittalUpStream.GetNamespaceOfPrefix(“irs”);
XNamespace n1=Form109495TransmittalUpStream.GetNamespaceOfPrefix(“n1”);
XElement form1094CUpstreamDetail=新XElement(定义+“form1094CUpstreamDetail”,新XAttribute[]{
新XAttribute(“记录类型”、“字符串”),新XAttribute(“lineNum”,0)
});
表格109495传输流。添加(表格1094上游详情);
表格109495TransmittalUpStream.Add(新的XElement(“提交