带冒号的xml元素名称

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

  • 我遇到了同样的问题,即使这种方法对我也不起作用。您是如何简单地实现&lt;ns1:E&gt;的? (2认同)

Joh*_*ett 5

冒号表示这些元素位于ns1 名称空间中.使用多个模式时需要这样做.假设文档仅使用ns1,它基本上等同于那些标签中没有任何"ns1:".有关详细信息,请参阅本指南.

  • 实际上,那些冒号表示元素位于`schema`命名空间中.`ns1`不是命名空间; 它是命名空间的缩写.它可以改变; 名称空间的名称不能 - 不能成为不同的名称空间. (3认同)

Rob*_*ney 5

您发布的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)

在所有三种情况下,EB元素在schema命名空间,同时S,VBl元素都在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)

要创建元素,然后将其附加到已经声明ns1schema命名空间前缀的元素,那么DOM将附加没有命名空间声明的元素,因为在该上下文中不需要它.如果ns1未声明(或被声明为缩写除了某些命名空间schema),则DOM将在元素和前缀上添加名称空间声明.

tl; dr:您关心命名空间,而不关心命名空间前缀.