none
Вставить группу элементов Xnode внутрь определенного элемента RRS feed

  • Вопрос

  • Здравствуйте. Подскажите пожалуйста что я делаю не так ?

    Вот элемент root

    <Файл ИдФайл="NO_NDS.9_1111_2222_7710000000771001001_20150211_151217" ВерсФорм="5.04">
      <Документ Индекс="0000090" НомКорр="0">
        <КнигаПрод СтПродОсвВсКПр="12222,52" СумНДСВсКПр10="0" СумНДСВсКПр18="3123335,05" СтПродБезНДС0="0" СтПродБезНДС10="134" СтПродБезНДС18="133473,01" />
      </Документ>
    </Файл>Пытаюсь внутрь элемента КнигаПрод добавить узлы из списка List<XNode> но получаю эксепшн 
    
    An unhandled exception of type 'System.NotSupportedException' occurred in System.Xml.dll

    Additional information: Указанный метод не поддерживается. Делаю вот так

    XDeclaration declaration = new XDeclaration("1.0", "WINDOWS-1251", "yes");
                XDocument file = new XDocument(declaration);
                XElement root = new XElement("Файл",
                    new XAttribute("ИдФайл", "NO_NDS.9_1111_2222_7710000000771001001_20150211_151217"),
                    new XAttribute("ВерсФорм", "5.04"),
                    new XElement("Документ",
                        new XAttribute("Индекс", "0000090"),
                        new XAttribute("НомКорр", "0"),
                        node));
    
                
                file.Add(root);
                XPathNavigator navigator = root.CreateNavigator();
                navigator.MoveToChild("Файл", "ExcelConverterV2");
                navigator.MoveToChild("Документ", "ExcelConverterV2");
                navigator.MoveToChild("КнигаПрод", "ExcelConverterV2");
    
                foreach (var item in listNodes)
                {
                    navigator.InsertBefore(item.ToString());
                }
                file.Save("NO_NDS.9_1111_2222_7710000000771001001_20150211_151217.xml");
    

    эксепшн получаю при выполнении navigator.InsertBefore(item.ToString());


    • Изменено Timur2008 7 октября 2015 г. 13:30
    7 октября 2015 г. 13:29

Ответы

  • Пробую так сделать тоже почемуто не работает :(

    root.Element("КнигаПрод").Add(listNodes);
    выбрасывается эксепшн

    Additional information: Ссылка на объект не указывает на экземпляр объекта.

    Хотя этот элемент там присутствует Оо 

    Разобрался :) сделал так

                
                
    root.Element("Документ").Element("КнигаПрод").Add(listNodes);
    Дошло наконец то как с этими вещами работать:)



    • Изменено Timur2008 7 октября 2015 г. 17:18
    • Помечено в качестве ответа Timur2008 7 октября 2015 г. 17:18
    7 октября 2015 г. 16:42

Все ответы

  • На MSDN про CreateNavigator написано следующие:
    You cannot edit the XML tree by using the XPathNavigator that is returned by this method. The CanEdit property returns false.
    7 октября 2015 г. 15:29
  • А вы не могли бы подсказать как решить эту задачу более правильно?
    7 октября 2015 г. 15:36
  • По идее, можно сразу создавать XML документ с нужным содержимым:
    new XDocument(new XDeclaration("1.0", "WINDOWS-1251", "yes"),
        new XElement("Файл",
            new XAttribute("ИдФайл", "NO_NDS.9_1111_2222_7710000000771001001_20150211_151217"),
            new XAttribute("ВерсФорм", "5.04"),
            new XElement("Документ",
                new XAttribute("Индекс", "0000090"),
                new XAttribute("НомКорр", "0"),
                new XElement("КнигаПрод",
                    new XAttribute("СтПродОсвВсКПр", "12222,52"),
                    new XAttribute("СумНДСВсКПр10", "0"),
                    new XAttribute("СумНДСВсКПр18", "3123335,05"),
                    new XAttribute("СтПродБезНДС0", "0"),
                    new XAttribute("СтПродБезНДС10", "134"),
                    new XAttribute("СтПродБезНДС18", "133473,01"),
                    listNodes
                )
            )
        )
    ).Save("NO_NDS.9_1111_2222_7710000000771001001_20150211_151217.xml");
    
    7 октября 2015 г. 15:50
  • ну да так можно делать но там тогда по уродски немного получится

    я хотел так сделать

    TypeDataConveter converter = new TypeDataConveter();
                var generalNode = converter.ConvertDataRowXNode(totalSum);
                var tabletonodes = converter.ConvertTableDataToNodes(tableseller);
                FileCreator.Build(generalNode, tabletonodes);
    тоесть передаю в метод отдельные куски xml файла а он уже из них собирает и сохраняет норм файл



    • Изменено Timur2008 7 октября 2015 г. 16:09
    7 октября 2015 г. 16:07
  • Пробую так сделать тоже почемуто не работает :(

    root.Element("КнигаПрод").Add(listNodes);
    выбрасывается эксепшн

    Additional information: Ссылка на объект не указывает на экземпляр объекта.

    Хотя этот элемент там присутствует Оо 

    Разобрался :) сделал так

                
                
    root.Element("Документ").Element("КнигаПрод").Add(listNodes);
    Дошло наконец то как с этими вещами работать:)



    • Изменено Timur2008 7 октября 2015 г. 17:18
    • Помечено в качестве ответа Timur2008 7 октября 2015 г. 17:18
    7 октября 2015 г. 16:42
  • root.Element("КнигаПрод").Add(listNodes);
    выбрасывается эксепшн

    Судя по вышеприведенному xml, код должен быть:

    root.Element("Документ").Element("КнигаПрод").Add(listNodes);
    

    Метод Add добавит элементы внутрь узла "КнигаПрод". Возможно, нужен метод AddAfterSelf или AddBeforeSelf.

    7 октября 2015 г. 17:16
  • да именно так и должно было быть :) Нет мне именно внутрь и нужно их добавить все :)
    • Изменено Timur2008 7 октября 2015 г. 17:25
    7 октября 2015 г. 17:22