控制XML名称空间的顺序

我在将“xmlns”首先出现在根属性列表中时遇到问题。

我得到这个:

 somecontent  

我想要这个:

  somecontent  

我的代码如下所示:

  XNamespace rt = "http://www.someurl.com/ns/myroot"; XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; var submissionNode = new XElement(XmlNameSpaces.rt + "myroot"); submissionNode.Add(new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance")); submissionNode.Add(new XAttribute(xsi + "schemaLocation", @"http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd");); 

改变订单我需要做些什么?

编辑:我理解订单通常不是相关的,但在这种情况下它是一个要求。

XmlWriter会是你的选择吗?

Afaik,它使您可以完全控制属性和命名空间声明的顺序。

IIRC,属性的顺序(以xml为单位)并不重要……所以为什么要改变呢? 它是否会导致实际问题?

XML文档中未指定属性排序,不应依赖它。 可能值得看一下规格

您会发现,如果您将XML文档读入DOM并将其写出来,无论平台/库如何,您都不能(也不应该)依赖属性排序。 这是一种常见的误解,顺便说一下!

我有一个客户遇到这个问题。 这是一个真正的痛苦 ,所以我写了一个解决方法来解决这个问题。

请注意这不是一个漂亮的解决方案,这不应该鼓励,但有效。

 public static class MyKludgeXmlClass { public static XmlDocument CreateXmlDocumentWithOrderedNamespaces() { var xml = ""; System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.LoadXml(xml); return doc; } } 

使用XmlDocument您可以检索根:

 var xmlDoc = MyKludgeXmlClass.CreateXmlDocumentWithOrderedNamespaces(); XmlElement root = xmlDoc.DocumentElement; 

并使用您喜欢的方法追加子节点。

因为有时正确的答案是说, 不,不要那样做……

XML建议 书中的每个W3C命名空间 ,第3节声明命名空间 :

[定义:使用一系列保留属性声明命名空间(或更确切地说,命名空间绑定)。 这样的属性名称必须是xmlns或begin xmlns : . 与任何其他XML属性一样,这些属性可以直接提供,也可以默认提供 。 ]

因此,命名空间声明的顺序(如任何属性的顺序)是无关紧要的

因此,没有符合条件的XML工具或库会关心命名空间声明的顺序,您也不应该这样做。

需要属性按指定顺序排列的软件不符合XML建议。

您应该问的第一个问题不是“如何以定义的顺序生成带有命名空间属性的XML?” 相反,它应该是,“这个软件不符合XML推荐的其他方面是什么?” 因为如果收件人的流程在某个方面违反了XML建议,我会打赌你会有一个新的美元,它会至少在另一个方面违反它。