控制XML命名空间的顺序

时间:2009-04-07 10:26:09

标签: c# xml

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

我得到了这个:

  <myroot 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd"
        xmlns="http://www.someurl.com/ns/myroot"> 

       <sometag>somecontent</sometag>

    </myroot>

我想要这个:

<myroot 
        xmlns="http://www.someurl.com/ns/myroot" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.someurl.com/ns/myroot http://www.someurl.com/xml/schemas/myschema.xsd">

       <sometag>somecontent</sometag>

    </myroot>

我的代码如下所示:

  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"););

更改订单需要做些什么?

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

6 个答案:

答案 0 :(得分:2)

XmlWriter可以选择吗?

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

public static class MyKludgeXmlClass
{
    public static XmlDocument CreateXmlDocumentWithOrderedNamespaces()
    {
        var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><MyRoot xmlns=\"http://www.example.com/schemas/1.0/VRSync\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.example.com/schemas/1.0/VRSync http://xml.example.com/vrsync.xsd\"></MyRoot>";
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.LoadXml(xml);

        return doc;
    }
}

使用XmlDocument,您可以检索根目录:

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

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

答案 3 :(得分:0)

XML文档中未指定属性排序,不应依赖它。值得一看the spec

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

答案 4 :(得分:0)

因为有时正确的答案就是说, 不,不要这样做......

W3C Namespaces in XML Recommendation,第3 Declaring Namespaces部分:

  

[定义:命名空间(或更准确地说,命名空间绑定)是   使用一系列保留属性声明。此类属性的名称必须为 xmlns 或开始 xmlns:。这些   与任何其他XML属性一样,可以直接或提供属性   由default。 ]

因此,命名空间声明的顺序(如order of any attributes无关紧要

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

答案 5 :(得分:-1)

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

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