我在将“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"););
更改订单需要做些什么?
编辑:我理解订单通常不是相关的,但在这种情况下它是一个要求。
答案 0 :(得分:2)
XmlWriter
可以选择吗?
Afaik,它可以让您完全控制属性和命名空间声明的顺序。
答案 1 :(得分:1)
答案 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建议,我会打赌你有一个新的美元,它会在至少另外一个方面违反它。