【问题标题】:Trouble with namespaces when adding Xml Element to document将 Xml 元素添加到文档时出现命名空间问题
【发布时间】:2014-04-28 09:11:30
【问题描述】:

我正在尝试将 XML 元素添加到文档中,但我对命名空间感到非常困惑。 有人可以在下面指出我做错了什么吗?

Xml 之前:

...
<TaxKeywordTaxHTField xmlns="e907f980-2644-454c-b5eb-278bd59dc318">
    <Terms xmlns="http://schemas.microsoft.com/office/infopath/2007/PartnerControls"/>
</TaxKeywordTaxHTField>
...

之后需要Xml:

...
<TaxKeywordTaxHTField xmlns="e907f980-2644-454c-b5eb-278bd59dc318">
    <Terms xmlns="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
        <TermInfo xmlns="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
            <TermName>Kenya</TermName>
            <TermId>283e7636-3eca-4a6c-8ea7-5c1b768b8f2b</TermId>
        </TermInfo>
    </Terms>
</TaxKeywordTaxHTField>
...

我的代码创建了以下内容:

...
<TaxKeywordTaxHTField xmlns="e907f980-2644-454c-b5eb-278bd59dc318">
    <Terms xmlns="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
        <TermInfo>
            <TermName xmlns="">Kenya</TermName>
            <TermId xmlns="">283e7636-3eca-4a6c-8ea7-5c1b768b8f2b</TermId>
        </TermInfo>
    </Terms>
</TaxKeywordTaxHTField>
...

这是我的代码:

var terms = DocumentManagment.Descendants(ns4 + "TaxKeywordTaxHTField")
                .Descendants(ns2 + "Terms").SingleOrDefault();
terms.AddFirst(
    new XElement(ns2 + "TermInfo",
        new XElement("TermName", "Kenya"),
        new XElement("TermId", "283e7636-3eca-4a6c-8ea7-5c1b768b8f2b")));

【问题讨论】:

    标签: c# xml namespaces linq-to-xml


    【解决方案1】:

    TermName 和 TermId 都在命名空间 "http://schemas.microsoft.com/office/infopath/2007/PartnerControls" 中,因此只需将此命名空间添加到它们的名称中即可:

     terms.AddFirst(
        new XElement(ns2 + "TermInfo",
            new XElement(ns2 + "TermName", "Kenya"),
            new XElement(ns2 + "TermId", "283e7636-3eca-4a6c-8ea7-5c1b768b8f2b")));
    

    这将产生以下xml:

    <TaxKeywordTaxHTField xmlns="e907f980-2644-454c-b5eb-278bd59dc318">
      <Terms xmlns="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
        <TermInfo>
          <TermName>Kenya</TermName>
          <TermId>283e7636-3eca-4a6c-8ea7-5c1b768b8f2b</TermId>
        </TermInfo>
      </Terms>
    </TaxKeywordTaxHTField>
    

    注意:因此TermInfo 与其父元素在同一个默认命名空间中,那么命名空间只是被继承而不是显式声明。

    另外请记住,如果您没有为元素指定命名空间,那么它会被认为在 None 命名空间中。但是如果父元素已经定义了默认命名空间,它是由子元素继承的,那么这个空的命名空间应该显式声明。这就是您在输出中看到 xmlns="" 的原因。

    【讨论】:

    • 谢谢。很好的解释。非常感谢。
    猜你喜欢
    • 2014-06-10
    • 2010-10-12
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多