Нежелательный встроенный формат пространства имен, сгенерированный в XML-атрибуте

Следующий код C# LINQ to XML создает один XElement, имеющий один XAttribute:

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

Он генерирует встроенное пространство имен, создавая следующий элемент XML, имеющий p1:

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

Однако то, что я действительно хочу, это:

<Worksheet ss:Name="Sheet1" />

Как получить вторую форму элемента?

Примечание. Если вы знаете структуру XML, я заполняю электронную таблицу Excel, но это не соответствует вопросу.

В конечном итоге я создаю элемент Worksheet в следующем документе Excel:

<?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>

person John K    schedule 09.01.2012    source источник


Ответы (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);

Создает желаемый XML-атрибут ss:Name:

<Worksheet ss:Name="Sheet1" 
person John K    schedule 09.01.2012
comment
Вы попробовали это и получили префикс ss? Я удивлен, что вам не нужно объявлять пространство имен, чтобы получить набор префиксов. Что-то вроде msdn.microsoft.com/en -нас/библиотека/ - person John Saunders; 10.01.2012
comment
Спасибо за ссылку; Я не пробовал .IsNamespaceDeclaration Приведенный выше код копируется и вставляется вместе с результатом, за исключением строки имени рабочего листа, которую я изменил на общий Sheet1. Но пространство имен ss объявлено в более крупном XML-документе, который я вставил внизу своего вопроса. - person John K; 10.01.2012