Не находит узлы в необычном XML

136
01 января 2021, 11:20

Вот отрывок XML файла, в котором нужно считать узлы ROW:

<?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">
 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  <AllowPNG/>
 </OfficeDocumentSettings>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>6030</WindowHeight>
  <WindowWidth>14055</WindowWidth>
  <WindowTopX>0</WindowTopX>
  <WindowTopY>0</WindowTopY>
  <RefModeR1C1/>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
    ss:Color="#000000"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="s69">
   <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
   <Borders>
    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
   </Borders>
  </Style>
  <Style ss:ID="s70">
   <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
   <Borders>
    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
   </Borders>
   <NumberFormat ss:Format="Short Date"/>
  </Style>
  <Style ss:ID="s71">
   <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
   <Borders>
    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
   </Borders>
   <NumberFormat ss:Format="mmm/yy"/>
  </Style>
  <Style ss:ID="s72">
   <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
   <Borders>
    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
   </Borders>
   <NumberFormat ss:Format="dd/mmm"/>
  </Style>
  <Style ss:ID="s76">
   <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
   <Borders>
    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
   </Borders>
   <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
    ss:Color="#000000" ss:Bold="1"/>
   <Interior ss:Color="#D9D9D9" ss:Pattern="Solid"/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Лист1">
  <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="101" x:FullColumns="1"
   x:FullRows="1" ss:DefaultRowHeight="15">
   <Column ss:AutoFitWidth="0" ss:Width="27"/>
   <Column ss:Width="52.5"/>
   <Column ss:Width="137.25"/>
   <Column ss:Width="138"/>
   <Column ss:Width="53.25"/>
   <Column ss:Width="57"/>
   <Column ss:Width="63"/>
   <Column ss:Width="77.25"/>
   <Column ss:Width="95.25"/>
   <Row>
    <Cell ss:StyleID="s76"><Data ss:Type="String">№</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">ЛС</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">ФИО Абонента</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">Адрес</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">Дом.КВ</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">ДОЛГ</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">ccounter</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">ТИП ПУ</Data></Cell>
    <Cell ss:StyleID="s76"><Data ss:Type="String">Дата Установки ПУ</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="s69"><Data ss:Type="Number">1</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="Number">340054288</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">БЕКСУЛТАНОВ  К. С.</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">НОВОСТРОЙКА  28 ГА</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="Number">271</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">108.8200</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">2015-061195</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">DDS 232</Data></Cell>
    <Cell ss:StyleID="s70"><Data ss:Type="DateTime">2017-09-05T00:00:00.000</Data></Cell>
   </Row>

Считываю так:

XmlDocument doc = new XmlDocument();
            doc.Load(filePath);
            XmlNodeList cellList = doc.SelectNodes("//Row/Cell");

Получаю пустой cellList, проверял при отладке. filePath нормальный, файл в doc загружен. Как считать все узлы ROW?

Answer 1

В показанном xml присутствует пространство имён по умолчанию:

xmlns="urn:schemas-microsoft-com:office:spreadsheet"

Все вложенные узлы без префикса относятся к этому пространству имён. Следовательно, в коде C# нужно обязательно указывать этот неймспейс.

var doc = new XmlDocument();
var manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("ns", "urn:schemas-microsoft-com:office:spreadsheet");
doc.Load(filePath);
var cellList = doc.SelectNodes("//ns:Row/ns:Cell", manager);

Нужно создать экземпляр менеджера неймспейсов, добавить в него все необходимые пространства имён. Далее в xpath указываем префикс неймспейса. Причём, обратите внимание, указываем его у всех элементов: и Row, и Cell.

READ ALSO
Создание кнопки в консоли на C#

Создание кнопки в консоли на C#

Возможно ли добавить в консольное приложение кнопку? Чтобы пользователь не вводил сообщение сам, а нажимал на слово и получал результатСвоеобразный...

107
Миграция в ClearDB MySQL

Миграция в ClearDB MySQL

Имеется БД MySQL, которую надо импортировать в heroku, но heroku работает только с postgresОднако есть плагин ClearDB MySQL

101
_mysql_exceptions.ProgrammingError: 1064

_mysql_exceptions.ProgrammingError: 1064

Нужно создать модели в Django на основе уже имеющейся БД mysqlДля этого я выполняю следующие команды:

97
Loop в mysql 8.0.16

Loop в mysql 8.0.16

Нужно сделать цикл для одноразовой вставки множества записей в таблицуПисал цикл по примеру из документации MySql, однако все равно получаю...

127