Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制XML名称空间的顺序_C#_Xml - Fatal编程技术网

C# 控制XML名称空间的顺序

C# 控制XML名称空间的顺序,c#,xml,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.some

我在让“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>
我需要做些什么来改变订单


编辑:我知道顺序通常不相关,但在这种情况下这是一个要求。

IIRC,属性的顺序(xml)不重要。。。那为什么要改变呢?它会导致实际问题吗?

您会选择
XmlWriter


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

属性顺序在XML文档中没有指定,因此不应该依赖它。这可能值得一看


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

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


您应该问的第一个问题不是“如何按照定义的顺序生成具有名称空间属性的XML?”而是“此软件在哪些方面不符合XML建议?”因为我敢打赌,如果收件人的流程在一个方面违反了XML建议,那么它至少在另一个方面违反了XML建议。

我有一个客户遇到了这个问题。这在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;
    }
}
并使用您喜欢的方法附加子节点。

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

每节:

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

因此,名称空间声明的顺序(如)无关紧要


因此,任何符合规范的XML工具或库都不会关心名称空间声明的顺序,您也不应该这样做。

/seconded-XML的全部要点是这样的事情都是非规范的-issues@Marc:签名XML文档/验证数字签名时,顺序可能很重要。W3C有一个名为Canonical XML()的建议,专门处理这样的用例。@divo-这就是问题所在;如果这是问题所在,那么值得努力。如果纯粹是装饰性的,可能不是。在XML数字签名中,签名的是规范的XML,而不是原始源。@John:是的,这显然是正确的。但是OP没有给出订单对他重要的原因,所以他可能只想这么做?事实上(+1);因为它是单向的,所以除了按您提供的顺序推出产品外,它什么也做不了。然而,这是一种完全不同的野兽。这是实现这一目标的唯一途径吗?Iv已经完成了相当复杂的文档创建,不想重新使用xmlwriterIf属性顺序很重要,您的客户要求您生成的不是真正的XML。因此,您需要采取自己的步骤,以客户指定的任何方式序列化它。@Dan,您不必重做您的工作。您还可以将XDocument写入一个过滤XmlWriter,它将对您的XML流进行后处理。@DirkVollmar您能看看这个吗?我已经尝试过使用XmlWriter来实现这一点,但它似乎仍然在无序地编写内容。谢谢,这只是我提交xml的组织的一项要求。Mmm。听起来他们在最后有个问题:-)你可能想看看你是否能影响下一轮投票。虽然这个“答案”事实上是正确的,但它并没有回答OP.Downvoting中的问题。同样,事实上是正确的,但不是对所问问题的答案。那么在创建xml的规范化版本时呢?@daneejela:请参阅与规范化/规范化标准相关的链接,但要意识到它们的存在并不会改变名称空间声明的顺序(如属性)在xml中无关紧要的事实,因此,XML解析器和其他XML库不会帮助您实现排序。您将需要专门的序列化程序,即使这样,您也将与其他消费者/生产者进行斗争,以维持这种无关紧要的顺序。
  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"););
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;
    }
}
var xmlDoc = MyKludgeXmlClass.CreateXmlDocumentWithOrderedNamespaces();
XmlElement root = xmlDoc.DocumentElement;