【问题标题】:Unwanted inline namespace format generated on XML AttributeXML 属性上生成的不需要的内联命名空间格式
【发布时间】:2012-01-09 19:31:16
【问题描述】:

以下 LINQ to XML C# 代码创建一个 XElement 和一个 XAttribute

XElement xWorksheet = 
    new XElement("Worksheet", new XAttribute(XName.Get("Name", "ss"), "Sheet1"));

它生成一个内联命名空间,生成以下具有 p1 的 XML 元素:

<Worksheet p1:Name="Sheet1" xmlns:p1="ss" />

但我真正想要的是:

<Worksheet ss:Name="Sheet1" />

如何获取元素的第二种形式?

注意:如果您认识 XML 结构,我正在填写一个 Excel 电子表格,但这只是问题的轶事。

我最终在以下 Excel 文档中创建了 Worksheet 元素:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">

  <Worksheet ss:Name="Sheet1">
    <Table>
      <Row>
        <Cell>
          <Data ss:Type="String">number </Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">name </Data>
        </Cell>
      </Row>
    </Table>
  </Worksheet>

</Workbook>

【问题讨论】:

    标签: linq-to-xml xml-namespaces


    【解决方案1】:

    我必须将我的 XML ss 命名空间定义为 XNamespace 实例,即:

    XNamespace ss = XNamespace.Get("urn:schemas-microsoft-com:office:spreadsheet");
    // Note: The string value doesn't seem to matter in my case.
    

    然后将命名空间实例与属性名称连接起来,如下所示:

    // Broken out into two steps for clarity. 
    XAttribute a = new XAttribute(ss + "Name", "Sheet1");
    // Put attribute on element:
    xWorksheet = new XElement("Worksheet", a);
    

    生成所需的 ss:Name XML 属性:

    <Worksheet ss:Name="Sheet1" 
    

    【讨论】:

    • 你试过这个,你得到ss作为前缀?我很惊讶您不必为了获得前缀集而声明命名空间。类似于msdn.microsoft.com/en-us/library/…
    • 感谢您的链接;我没有尝试过.IsNamespaceDeclaration 上面的代码被复制并与结果一起粘贴,除了我将工作表名称字符串更改为通用“Sheet1”。但是ss 命名空间是在我粘贴在问题底部的较大 XML 文档中声明的。
    猜你喜欢
    • 2011-06-08
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多