C# 如何将xmlns添加到xml文档中?

C# 如何将xmlns添加到xml文档中?,c#,xml,linq-to-xml,xml-namespaces,C#,Xml,Linq To Xml,Xml Namespaces,我试图创建一个相当简单的XML文档,如下所示 <?xml version="1.0" encoding="UTF-8"?> <employees xmlns="http://website.com/xsd/MQ"> <employee> <id>00122731</id> <first-name>LUIS</first-name> <last-name

我试图创建一个相当简单的XML文档,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<employees xmlns="http://website.com/xsd/MQ">
    <employee>
        <id>00122731</id>
        <first-name>LUIS</first-name>
        <last-name>GARCIA</last-name>
        <subarea>4100</subarea>
        <cost-center>904</cost-center>
        <email-address>L.GARCIA@EMAIL.COM</email-address>
    </employee>
</employees>
这是我试图添加它,但我得到一个错误,这将导致和无效的结构

XDocument xmlDoc = new XDocument(
    new XElement("employees",
        new XAttribute("xmlns", "http://website/xsd/MQ")),                        
        from e in listEmployees
        select new XElement("employee",
            new XElement("id", e.EmployeeId),
            new XElement("first-name", e.FirstName),
            new XElement("last-name", e.LastName),
            new XElement("subarea", e.SubArea),
            new XElement("cost-center", e.CostCenter),
            new XElement("email-address", e.EmailAddress))
);
更新

根据下面提供的链接,这是我想出的有效方法

XNamespace ns = "http://website/xsd/MQ";
var xmlDoc = new XElement(ns + "employees",
from e in listEmployees
select new XElement("employee",
    new XElement("id", e.EmployeeId),
    new XElement("first-name", e.FirstName),
    new XElement("last-name", e.LastName),
    new XElement("subarea", e.SubArea),
    new XElement("cost-center", e.CostCenter),
    new XElement("email-address", e.EmailAddress)));

您需要在所有元素上包括名称空间,而不仅仅是顶部元素:

XNamespace ns = "http://website/xsd/MQ";
var xmlDoc = new XElement(ns + "employees",
    from e in listEmployees
    select new XElement(ns + "employee",
        new XElement(ns + "id", e.EmployeeId),
        new XElement(ns + "first-name", e.FirstName),
        new XElement(ns + "last-name", e.LastName),
        new XElement(ns + "subarea", e.SubArea),
        new XElement(ns + "cost-center", e.CostCenter),
        new XElement(ns + "email-address", e.EmailAddress)
    )
);
如果这对您来说太重复,您可以使用一种方便的方法:

XNamespace ns = "http://website/xsd/MQ";
private static XElement MQElement(string name, object contents)
{
    return new XElement(ns + name, contents);
}
然后使用它:

var xmlDoc = MQElement("employees",
    from e in listEmployees
    select MQElement("employee",
        MQElement("id", e.EmployeeId),
        MQElement("first-name", e.FirstName),
        MQElement("last-name", e.LastName),
        MQElement("subarea", e.SubArea),
        MQElement("cost-center", e.CostCenter),
        MQElement("email-address", e.EmailAddress)
    )
);

您需要在所有元素上包括名称空间,而不仅仅是顶部元素:

XNamespace ns = "http://website/xsd/MQ";
var xmlDoc = new XElement(ns + "employees",
    from e in listEmployees
    select new XElement(ns + "employee",
        new XElement(ns + "id", e.EmployeeId),
        new XElement(ns + "first-name", e.FirstName),
        new XElement(ns + "last-name", e.LastName),
        new XElement(ns + "subarea", e.SubArea),
        new XElement(ns + "cost-center", e.CostCenter),
        new XElement(ns + "email-address", e.EmailAddress)
    )
);
如果这对您来说太重复,您可以使用一种方便的方法:

XNamespace ns = "http://website/xsd/MQ";
private static XElement MQElement(string name, object contents)
{
    return new XElement(ns + name, contents);
}
然后使用它:

var xmlDoc = MQElement("employees",
    from e in listEmployees
    select MQElement("employee",
        MQElement("id", e.EmployeeId),
        MQElement("first-name", e.FirstName),
        MQElement("last-name", e.LastName),
        MQElement("subarea", e.SubArea),
        MQElement("cost-center", e.CostCenter),
        MQElement("email-address", e.EmailAddress)
    )
);

实现相同结果的另一个选项是构造
XElement
完全忽略名称空间,然后将它们添加到单独的代码中:

foreach (XElement e in xmlDoc.DescendantsAndSelf())
{
  if (e.Name.Namespace == "")
  {
    e.Name = ns + e.Name.LocalName;
  }
}

实现相同结果的另一个选项是构造
XElement
完全忽略名称空间,然后将它们添加到单独的代码中:

foreach (XElement e in xmlDoc.DescendantsAndSelf())
{
  if (e.Name.Namespace == "")
  {
    e.Name = ns + e.Name.LocalName;
  }
}

看看这个答案:它有一个使用XNamespace添加名称空间的示例。谢谢…这个链接很有帮助。我在我的原始帖子中发布了更新后的代码。看看这个答案:它有一个使用XNamespace添加名称空间的示例。谢谢…这个链接很有帮助。我在原来的帖子中发布了更新后的代码。