nel*_*ebs 20 .net xml namespaces linq-to-xml
我正在攻击第三方xml api.他们定义了一个类似于以下所需的xml结构.
<ns1:E xmlns:ns1="schema">
<ns1:B>
<ns2:S>
<ns2:V>
<ns2:Bl />
</ns2:V>
</ns2:S>
</ns1:B>
</ns1:E>
Run Code Online (Sandbox Code Playgroud)
有一个SQL表,其中包含我需要放入此xml格式的信息.我有一个LINQ to SQL适配器来获取数据,我正在使用a System.Xml
来创建XML文档.
XmlDocument.CreateElement("ns1:E"); etc
Run Code Online (Sandbox Code Playgroud)
只要我从元素名称中删除冒号,这样就可以正常工作.使用冒号,只有冒号的右侧是元素名称.我知道冒号是禁止的,但我对第三方api所指控的内容没有任何控制权.
有什么方法可以解决这个问题?是否有任何有用的方法可以强制冒号进入元素名称?我不必使用XMLDocument
但不确定其他方法会让我在那里.
更新:我意识到指的<ns1:
是命名空间.是的,有2.当写出XML时,如果我说 - 我可以让它工作 -
XmlDocument.CreateElement(ns1:E", "http://schema);
Run Code Online (Sandbox Code Playgroud)
但是,这是XML输出
<ns1:E xmlns:ns1="http://schema">
Run Code Online (Sandbox Code Playgroud)
如果我只是说XmlDocument.CreateElement("ns1:E");
没有uri,那么输出就是<E>
.我不希望输出具有架构引用,但我需要有前缀.我想要实现的结果很简单<ns1:E>
.两个namspace都在顶部声明,我认为这意味着我必须在每个节点声明它们.
nel*_*ebs 14
好的,这是.
XmlDocument.CreateElement("prefix", "name", "uri");
Run Code Online (Sandbox Code Playgroud)
如果它可以帮助其他人,请参考此处:http ://msdn.microsoft.com/en-us/library/c22k3d47.aspx 1
您发布的XML文档实际上并不是格式正确,因为ns2
分配给许多元素的缩写与命名空间无关.固定,它可能看起来像这样:
<ns1:E xmlns:ns1="schema" xmlns:ns2="my-namespace">
<ns1:B>
<ns2:S>
<ns2:V>
<ns2:Bl />
</ns2:V>
</ns2:S>
</ns1:B>
</ns1:E>
Run Code Online (Sandbox Code Playgroud)
上面的XML文档在语义上等同于这个:
<s:E xmlns:s="schema">
<s:B>
<S xmlns="my-namespace">
<m:V xmlns:m="my-namespace">
<s:Bl xmlns:s="my-namespace"/>
</m:V>
</S>
</s:B>
</s:E>
Run Code Online (Sandbox Code Playgroud)
对于这一个:
<E xmlns="schema">
<B xmlns="schema">
<S xmlns="my-namespace">
<V>
<Bl/>
</V>
</S>
</B>
</E>
Run Code Online (Sandbox Code Playgroud)
在所有三种情况下,E
和B
元素在schema
命名空间,同时S
,V
和Bl
元素都在my-namespace
命名空间.
命名空间前缀很有用,但严格来说它们是不必要的.您可以创建XML文档,如上一个示例,不使用前缀,并为每个元素显式声明名称空间.
如果在处理XML时,您认为您关心给定元素使用的前缀,那么您几乎肯定是错的.你唯一关心的是它所属的命名空间.例如,如果我将这三个文档中的任何一个加载到一个中XmlDocument
,则以下代码将写出'Bl'元素:
XmlNamespaceManager ns = new XmlNamespaceManager(d.NameTable);
ns.AddNamespace("a", "schema");
ns.AddNamespace("b", "my-namespace");
Console.Write(d.SelectSingleNode("/a:E/a:B/b:S/b:V/b:Bl", ns).OuterXml);
Run Code Online (Sandbox Code Playgroud)
当你说:
我不希望输出具有架构引用,但我需要有前缀.我想要实现的结果很简单
<ns1:E>
.
你几乎肯定是错误的.ns1:E
除非ns1
前缀映射到该元素或其祖先之一的命名空间,否则其标记无意义的元素.(另外,命名空间不是架构引用.)如果使用
CreateElement("ns1", "E", "schema");
Run Code Online (Sandbox Code Playgroud)
要创建元素,然后将其附加到已经声明ns1
为schema
命名空间前缀的元素,那么DOM将附加没有命名空间声明的元素,因为在该上下文中不需要它.如果ns1
未声明(或被声明为缩写除了某些命名空间schema
),则DOM将在元素和前缀上添加名称空间声明.
tl; dr:您关心命名空间,而不关心命名空间前缀.