Создать XML в C# Используя Specifi c XML Пространство имен - PullRequest
1 голос
/ 08 января 2020

Цель XML Я пытаюсь достичь:

<Row><Data ss:Type="String">value</Data></Row>

Вывод, который я получаю в настоящее время:

<Row xmlns=""><Data Type="Number">0</Data></Row>

Я пытаюсь создать этот целевой код XML, используя System.Xml библиотека, но префикс пространства имен не появляется при создании новых элементов. Фрагмент кода, который генерирует вышеуказанный вывод:

XmlElement eRow = xDoc.CreateElement("Row");
XmlElement eData = xDoc.CreateElement("Data");
XmlAttribute xAt = xDoc.CreateAttribute("ss", "Type", null);
xAt.Value = "Number";
eData.Attributes.Append(xAt);
eData.InnerText = "0";
eRow.AppendChild(eData);

Я пытаюсь добавить это XML в файл, который уже существует. Я загрузил файл как

XmlDocument xTemp = new XmlDocument();
xTemp.Load(templatePath);

, и в DocumentElement.Attributes уже есть пространства имен, в которых уже объявлен префикс, который я хочу использовать: <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">. По сути, я пытаюсь заставить префикс «ss» отображаться перед «Type», как в приведенной выше цели. Кроме того, вывод отображает xmlns="" как атрибут в теге «Row», чего я никогда не добавлял. Я предполагаю, что это обе проблемы с пространством имен, которое не было объявлено, но, как упоминалось выше, оно уже должно быть объявлено в исходном документе, который я загрузил.

Как я могу сгенерировать целевой код XML, который я хочу?

1 Ответ

0 голосов
/ 08 января 2020

Вы создали свой атрибут xAt без указания пространства имен uri, которое эквивалентно пустому строковому пространству имен uri (см. соответствующий MSDN do c здесь ), что, безусловно, почему вы получаете <Row xmlns="">

На самом деле вам нужно указать точное URI пространства имен, чтобы оно работало так, как вы ожидаете. Позвольте мне проиллюстрировать, используя пространство имен uri, которое вы задали в своем вопросе (Иллюстрация очень похожа на ваш исходный код, но может иметь несколько небольших различий, которые вы можете легко изменить).

String namespaceUri = "urn:schemas-microsoft-com:office:spreadsheet";
XmlDocument xDoc = new XmlDocument();

XmlElement workbook = xDoc.CreateElement("ss", "Workbook", namespaceUri);
XmlElement rows = xDoc.CreateElement("Rows");

На этом шаге я могу предположить что у меня есть XmlDocument, похожий на тот, что у вас есть после первоначальной загрузки вашего файла. Мой XmlDocument имеет узел workbook в качестве своего DocumentElement, он использует заданный префикс и пространство имен uri.

Теперь мы можем создать атрибут:

var attribute = xDoc.CreateAttribute("ss", "Type", "urn:schemas-microsoft-com:office:spreadsheet");
attribute.Value = "String";

Пространство имен uri должен быть указан правильно, иначе он не будет правильно отображен. Когда этот атрибут используется, поскольку пространство имен, к которому он обращается, находится в элементе вложенности (рабочей книге), нет необходимости упоминать его здесь снова, и платформа автоматически удалит ссылку на пространство имен uri.

Теперь мы можем go вперед и создать элементы Row и data и добавить атрибут в коллекцию атрибутов элемента Data.

XmlElement eRow = xDoc.CreateElement("Row");
XmlElement eData = xDoc.CreateElement("Data");

eData.Attributes.Append(attribute);
eData.InnerText = "value";
eRow.AppendChild(eData);

rows.AppendChild(eRow);
workbook.AppendChild(rows);

xDoc.AppendChild(workbook);

Затем мы можем отобразить документ, например, с помощью:

Console.WriteLine(xDoc.OuterXml);

Результат:

<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"><Rows><Row><Data ss:Type="String">value</Data></Row></Rows></ss:Workbook>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...