Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
3 / 3 / 0
Регистрация: 09.10.2019
Сообщений: 117
1
.NET 3.x

Прочитать Xml файл, XPath

09.10.2019, 23:16. Просмотров 1522. Ответов 6


Доброго времени суток!

Пытаюсь на C# просмотреть(прочитать, распарсить, как угодно называйте, не придирайтесь, терминологией в совершенстве не владею, за что заранее прошу прощения).
Пытался с помощью XPath, и никак...
Сам файлик прикладываю, в гугле не забанили, но мне не хватает той информации, которую нашёл, например, здесь:
https://docs.microsoft.com/ru-... navigation
или здесь:
http://zvon.org/xxl/XPathTutor... mples.html
Хочется объяснения мелкими шагами.

Notepad++ на XML ругается, но IE открывает, и, в принципе, удалил ту строку, Notepad++ всё равно ругается.
Был бы признателен за работающий код, в котором бы читалось хотя бы 2 узла, дальше, думаю, додумаю.
Свои потуги прикладывать не буду - писал и комментировал, ну, например(одна из крайних попыток):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("#PMRPT0103192910668020.XML");
            XmlNode root = doc.DocumentElement;
 
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            //nsmgr.AddNamespace("gl", "paymentmessages");
            //XmlNode fNode = root.SelectSingleNode("descendant::gl:AppHdr", nsmgr);
            XmlNode fc = root.FirstChild;
            nsmgr.AddNamespace("Hdr", "urn:iso:std:iso:20022:tech:xsd:head.001.001.01");
            XmlNode fNode = fc.SelectSingleNode("fr", nsmgr);
 
            //XmlNodeList nn = fc.SelectNodes("fr/");
            Console.WriteLine(fc.Name);
            
        }
Проблема - ни SelectSingleNode, ни SelectNodes не выбирают ничего... Как правильно?

Спасибо!
0
Вложения
Тип файла: zip 11.zip (1.3 Кб, 4 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2019, 23:16
Ответы с готовыми решениями:

Прочитать xml файл, желательно через XmlDocument
<response retval='0' sval='Success' lastAccess='1/10/2012 11:33:57 AM' expires='1/10/2012 11:53:57...

Прочитать XML файл и вывести трехуровневое дерево информации
Доброго всем форумчанинам, задался попытаться сделать программу для вывода информации в...

Как записать/прочитать многострочный текст в XML файл?
Предполагаю сохранять настройки приложения в XML файл. Для этого использую следующий код....

Как прочитать xml файл из внешнего источника и на основе полученных данных сформировать HTML таблицы?
Дана задача, нужно по API получить листы с сервера, найти среди них с подтверждением(DoubleOptIn) и...

6
5359 / 2092 / 612
Регистрация: 11.04.2015
Сообщений: 3,532
Записей в блоге: 41
10.10.2019, 05:30 2
C#
1
2
3
4
5
6
7
8
9
10
            var appdir = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
            var doc = new XmlDocument();
            doc.Load(Path.Combine(appdir, "files", "11.xml"));
            var nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("x", "urn:iso:std:iso:20022:tech:xsd:head.001.001.01");
            var frs = doc.SelectNodes("//x:Id", nsmgr);
            foreach(XmlElement fr in frs)
            {
                Console.WriteLine(fr.InnerText);
            }
0
3 / 3 / 0
Регистрация: 09.10.2019
Сообщений: 117
11.10.2019, 00:37  [ТС] 3
Спасибо!
Да, работает.
Неправильно поставил задачу.
Дело в том, что мне из всего этого файла выбрать всего несколько узлов по их полному имени.
Хотелось бы увидеть поиск именно по полному имени, например:

Document/BkToCstmrDbtCdtNtfctn/GrpHdr/CreDtTm

С этим проблема.
0
5359 / 2092 / 612
Регистрация: 11.04.2015
Сообщений: 3,532
Записей в блоге: 41
11.10.2019, 05:11 4
Цитата Сообщение от Тормоз Посмотреть сообщение
С этим проблема.
Ну какая проблема-то? Все решается также. В менеджер пространств имен добавь нужное пространство, соотнеси его с каким-нибудь префиксом, если поиск начинается от документа(не элемента Document а самого хмл-документа), то либо два слеша пере выражением, либо придется путь писать полностью, начиная корня документа или можно начинать поиск с родителя узла Document. Каждому элементу должен предшествовать префикс сопоставленный с пространством имен, к которому этот элемент относится. Ну и не забывай, что XPath, как и XML - языки регистрозависимые.
0
3 / 3 / 0
Регистрация: 09.10.2019
Сообщений: 117
11.10.2019, 07:45  [ТС] 5
Поменял пространство имён, мне нужна ветка Document (за оригинал твой текст):
C#
1
nsmgr.AddNamespace("x", "urn:iso:std:iso:20022:tech:xsd:camt.054.001.06");
Вместо
C#
1
var frs = doc.SelectNodes("//x:Id", nsmgr);
поставил :
C#
1
var frs = doc.SelectNodes("//x:Document", nsmgr);
попробовал, работает, и вроде как выдаёт нужный результат - всё поддерево.

Но почему не работает:
C#
1
var frs = doc.SelectNodes("//x:Document/BkToCstmrDbtCdtNtfctn", nsmgr);
в выдаче ничего нет, а если
C#
1
var frs = doc.SelectNodes("//x:BkToCstmrDbtCdtNtfctn", nsmgr);
то так же, как и с Document, и это понятно.

Попробовал
C#
1
var xn = doc.SelectSingleNode("//x:Document/BkToCstmrDbtCdtNtfctn", nsmgr);
xn получает null. Ну, это вроде как бы и должно так быть

пробовал
C#
1
var xn = doc.SelectSingleNode("//x:Document/BkToCstmrDbtCdtNtfctn/GrpHdr/MsgId", nsmgr);
и тоже null, и вот этого и не понимаю - что тут не так.
0
5359 / 2092 / 612
Регистрация: 11.04.2015
Сообщений: 3,532
Записей в блоге: 41
11.10.2019, 09:52 6
Цитата Сообщение от Тормоз Посмотреть сообщение
и вот этого и не понимаю - что тут не так.
Цитата Сообщение от diadiavova Посмотреть сообщение
Каждому элементу должен предшествовать префикс сопоставленный с пространством имен, к которому этот элемент относится.
В хмл декларация пространства имен действует не только в том элементе, где она объявлена, но и во всех вложенных элементах, пока не будет переопределена. То есть писать надо так //x:Document/x:BkToCstmrDbtCdtNtfctn/x:GrpHdr/x:MsgId

Добавлено через 3 минуты
И кстати, если надо взять все MsgId внутри Document, то можно и так //x:Document//x:MsgId, необязательно весь путь писать. А если это пространство используется только в этой области документа, то возможно можно сделать как я в первый раз показал. Но это так, просто к сведению.
1
3 / 3 / 0
Регистрация: 09.10.2019
Сообщений: 117
11.10.2019, 10:08  [ТС] 7
ВОТ!
Похоже, как раз то чего мне и не хватало!!!
Спасибо!
Сейчас ещё с аргументами разберусь(попытаюсь), и будет великолепно!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2019, 10:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

XPath и работа с xml-файлом
Есть xml файл со структурой <?xml version="1.0" encoding="utf-8"?> <root> <element id=""> ...

Чем XPath лучше других методов работы с XML?
Здравствуйте. Не раз натыкался на темы, где у автора возникали проблемы с работай с XML, часто...

Что нужно писать, чтобы освоить Xml и XPath
Добрый день. В целях самообучения решил уделить внимание связке Xml, XPath. Подскажите, какое...

Как прочитать XML?
Собственно нужно прочитать и присвоить данные переменным соответствующим названию атрибута в xml.....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.