将Xml元素添加到文档时,名称空间有问题

时间:2014-04-28 09:11:31

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

我试图将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")));

1 个答案:

答案 0 :(得分:1)

TermNameTermId都位于命名空间"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=""的原因。