Ошибка XMLDocument.Importnode

В настоящее время я работаю над проектом, где мне нужно создавать XMLNodes и вставлять их в определенные места в XML-файле.

XMLNode – это строка с 90 ячейками.

<Row ss:AutoFitHeight=\"0\"> <Cell ss:StyleID=\"s77\"><Data ss:Type=\"String\">ABC</Data></Cell> <Cell><Data ss:Type=\"Number\">100</Data></Cell> <Cell ss:StyleID=\"s77\"><Data ss:Type=\"String\">ABC</Data></Cell> <Cell><Data ss:Type=\"String\" x:Ticked=\"1\">---</Data></Cell> </Row> 

Я создаю документ через Stringbuilder и читаю их с помощью:

  using (StringReader sr = new StringReader((sbuilder.ToString()))) using (XmlTextReader xtr = new XmlTextReader(sr) { Namespaces = false }) { xdoc.Load(xtr); } 

Файл XML, в который я хочу добавить свои узлы, – это лист Excel 2003 с 3 вкладками, но мне нужен только первый. Я загружаю его с помощью:

  XmlDocument xtemplate = new XmlDocument(); xtemplate.Load(file); 

и попытайтесь импортировать мой узел в XML-шаблон

 XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); 

И здесь я получаю исключение XmlException

Символы «:» – «Hex» 0x3A не должны включаться в имя.

Я не знаю, откуда это происходит. Никакая ячейка или строка не получает пользовательское имя, и я не мог найти имя, содержащее что-либо, кроме букв (кроме документа, который имеет «#document» в качестве имени)

Я надеюсь, что кто-то тоже испытал это исключение и мог бы помочь мне понять его, чтобы я мог решить свою проблему.


Надеюсь, вы поймете, что такое моя проблема, если я не попытаюсь изо всех сил объяснить это лучше. Мой английский немного ржавый, поэтому милостивый, если я его убил.

Обновить:

Теперь он работает с решением от @dbc и litte Дополнение:

 string innerXml = @"<Row 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"" ss:AutoFitHeight=""0""> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""Number"">100</Data> </Cell> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""String"" x:Ticked=""1"">---</Data> </Cell> </Row>"; var xdoc = new XmlDocument(); xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false }) XmlDocument xtemplate = new XmlDocument(); // Load xtemplate from file as before XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); // Insert into Target Document tempnode.ChildNodes[0].ParentNode.Attributes.RemoveAt(0); // Times 5 to delete all Namespacedefinitions электронные string innerXml = @"<Row 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"" ss:AutoFitHeight=""0""> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""Number"">100</Data> </Cell> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""String"" x:Ticked=""1"">---</Data> </Cell> </Row>"; var xdoc = new XmlDocument(); xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false }) XmlDocument xtemplate = new XmlDocument(); // Load xtemplate from file as before XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); // Insert into Target Document tempnode.ChildNodes[0].ParentNode.Attributes.RemoveAt(0); // Times 5 to delete all Namespacedefinitions электронные string innerXml = @"<Row 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"" ss:AutoFitHeight=""0""> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""Number"">100</Data> </Cell> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""String"" x:Ticked=""1"">---</Data> </Cell> </Row>"; var xdoc = new XmlDocument(); xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false }) XmlDocument xtemplate = new XmlDocument(); // Load xtemplate from file as before XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); // Insert into Target Document tempnode.ChildNodes[0].ParentNode.Attributes.RemoveAt(0); // Times 5 to delete all Namespacedefinitions 

Проблема в том, что в вашем фрагменте XML вы не определили пространства имен, соответствующие префиксам пространства имен ss и x . Префикс пространства имен представляет собой просто сокращенный поиск в таблице фактических пространств имен в области для данного элемента. Таким образом, следующие

 <ss:Row xmlns:ss="http://somenamespace"/> <xxxx:Row xmlns:xxxx="http://somenamespace"/> <Row xmlns="http://somenamespace"/> 

все определяют одно и то же – элемент XML с именем {http://somenamespace}Row .

Когда ImportNode копирует ваши узлы из одного документа в другой, он пытается сопоставить префиксы пространства имен из старого документа в новый документ, чтобы сохранить фактическое пространство имен каждого узла, – но ваши префиксы не имеют своих определений, поэтому отображение не может быть выполнено и генерируется исключение.

Чтобы исправить это, вы должны добавить правильные определения пространства имен в ваш XML-фрагмент, соответствующий тем, которые используются в формате Excel 2003 XML. Справочные схемы Office 2003: XML будут сообщать вам правильные пространства имен. Сделав это, вы должны использовать XmlDocument.LoadXml() для загрузки фрагмента XML, а затем исключение из ImportNode исчезнет.

Например:

  string innerXml = @"<Row 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"" ss:AutoFitHeight=""0""> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""Number"">100</Data> </Cell> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""String"" x:Ticked=""1"">&#45;&#45;-</Data> </Cell> </Row>"; var xdoc = new XmlDocument(); xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false }) XmlDocument xtemplate = new XmlDocument(); // Load xtemplate from file as before XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); // No exception электронные  string innerXml = @"<Row 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"" ss:AutoFitHeight=""0""> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""Number"">100</Data> </Cell> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""String"" x:Ticked=""1"">&#45;&#45;-</Data> </Cell> </Row>"; var xdoc = new XmlDocument(); xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false }) XmlDocument xtemplate = new XmlDocument(); // Load xtemplate from file as before XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); // No exception электронные  string innerXml = @"<Row 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"" ss:AutoFitHeight=""0""> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""Number"">100</Data> </Cell> <Cell ss:StyleID=""s77""> <Data ss:Type=""String"">ABC</Data> </Cell> <Cell> <Data ss:Type=""String"" x:Ticked=""1"">&#45;&#45;-</Data> </Cell> </Row>"; var xdoc = new XmlDocument(); xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false }) XmlDocument xtemplate = new XmlDocument(); // Load xtemplate from file as before XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); // No exception 
Interesting Posts

Список функций VBA в модуле в защищенном проекте

Многовариантные серии авторегрессионных рядов с использованием StatsModels в Python: что делать после установки модели?

Excel DNA в ошибке VB.NET «Xcopy вышел с кодом 9009»

vba, как zip-файл со специальными символами?

как заменить значение в строке на основе значения в другом столбце в excel

Создайте дату на две ячейки – одну с датой и другую с часом в Excel

CMD / Batch Get Handle для открытия приложения?

Добавление серии к диаграмме для каждой новой строки диапазона

Мой код закрывает книгу, но не окно

Как прочитать определенный лист в файле Excel с помощью Microsoft.Office.Interop.Excel

Использование COUNTIFS для подсчета и исключения нескольких текстов в столбце

Макрос VBA для группировки всех строк под одним заголовком, заголовки, когда существует более одного заголовка

Получить в столбце B слова столбца A, которые «не в словаре»

как сохранить начальный цвет ячеек, а код – hilighting active row

Запись в рабочий лист Excel из пользовательской функции VBA (не суб)

Давайте будем гением компьютера.