C# 控制XML名称空间的顺序
我在让“xmlns”首先出现在根属性列表中时遇到问题 我明白了: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
<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;