Проблемы чтения сложного XML - файла на языке Си#
Я действительно борюсь с пониманием пространств имен и чтением из XML-файла. Я могу читать "простые" данные из XML-файла, но как только данные "прячутся" за новым пространством имен XSD/, моя программа выдает ошибку: "
Системы.В формате XML.В XPath.XPathException: 'требуется диспетчер пространств имен или XsltContext. Этот запрос имеет префикс, переменную или определяемую пользователем функцию.'"
//READ THE XML FILE AND TAKE ACTIONS XmlDocument serverDoc = new XmlDocument(); serverDoc.Load(fileName); var nsmgr = new XmlNamespaceManager(serverDoc.NameTable); nsmgr.AddNamespace("catalogue_item_notification", "urn:gs1:gdsn:catalogue_item_notification:xsd:3"); nsmgr.AddNamespace("allergen_information", "urn:gs1:gdsn:allergen_information:xsd:3"); XmlNodeList xml = serverDoc.SelectNodes("/catalogue_item_notification:catalogueItemNotificationMessage/transaction/documentCommand/catalogue_item_notification:catalogueItemNotification/catalogueItem", nsmgr); foreach(XmlNode node in xml) { //DECIDE NATURE OF UPDATE if (node.SelectSingleNode("tradeItem/tradeItemUnitDescriptorCode").InnerText == "BASE_UNIT_OR_EACH") { var glncode = node.SelectSingleNode("tradeItem/gtin").InnerText; var partyName = node.SelectSingleNode("tradeItem/informationProviderOfTradeItem/partyName").InnerText; var allergen = node.SelectSingleNode("tradeItem/tradeItemInformation/extension/allergen_information:allergenInformationModule/allergenRelatedInformation/allergenSpecificationAgency").InnerText; (THIS ONE IS THROWING THE ERROR) Console.WriteLine(fileName); Console.WriteLine(glncode); Console.WriteLine(partyName); Console.WriteLine(allergen); Console.ReadKey(); }
Мой XML - файл-это файл GS1 "item notification". Это часть файла:
<pre><?xml version="1.0" encoding="utf-8"?> <catalogue_item_notification:catalogueItemNotificationMessage xmlns:sh="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:gs1:gdsn:catalogue_item_notification:xsd:3 http://www.gdsregistry.org/3.1/schemas/gs1/gdsn/CatalogueItemNotification.xsd" xmlns:catalogue_item_notification="urn:gs1:gdsn:catalogue_item_notification:xsd:3"> <sh:StandardBusinessDocumentHeader> <sh:HeaderVersion>1.0</sh:HeaderVersion> <sh:Sender> <sh:Identifier Authority="GS1">5790000500000</sh:Identifier> </sh:Sender> <sh:Receiver> <sh:Identifier Authority="GS1">5790000718689</sh:Identifier> </sh:Receiver> <sh:DocumentIdentification> <sh:Standard>GS1</sh:Standard> <sh:TypeVersion>3.1</sh:TypeVersion> <sh:InstanceIdentifier>Message-b7075b70-6739-4bc8-978a-9e9aed65f858</sh:InstanceIdentifier> <sh:Type>catalogueItemNotification</sh:Type> <sh:CreationDateAndTime>2020-11-03T11:06:54.8395136+00:00</sh:CreationDateAndTime> </sh:DocumentIdentification> </sh:StandardBusinessDocumentHeader> <transaction> <transactionIdentification> <entityIdentification>Transaction-617506c2-6c9b-4cab-82e8-2fc53a168c47</entityIdentification> <contentOwner> <gln>5790001104061</gln> </contentOwner> </transactionIdentification> <documentCommand> <documentCommandHeader type="CHANGE_BY_REFRESH"> <documentCommandIdentification> <entityIdentification>DocumentCommand-7928fe5f-421f-4046-8629-9e1483183eb8</entityIdentification> <contentOwner> <gln>5790001104061</gln> </contentOwner> </documentCommandIdentification> </documentCommandHeader>
Я могу прочитать все вышесказанное - никаких проблем... Но дальше в XML-файле это всплывает и пытается прочитать из этого, бросьте ошибку (f.x.), пытаясь прочитать "allergenSpecificationAgency":
<tradeItemInformation> <extension> <allergen_information:allergenInformationModule xsi:schemaLocation="urn:gs1:gdsn:allergen_information:xsd:3 http://www.gdsregistry.org/3.1/schemas/gs1/gdsn/AllergenInformationModule.xsd" xmlns:allergen_information="urn:gs1:gdsn:allergen_information:xsd:3"> <allergenRelatedInformation> <allergenSpecificationAgency>EU</allergenSpecificationAgency> <allergenSpecificationName>2003/89/EC</allergenSpecificationName> <allergen> <allergenTypeCode>AW</allergenTypeCode> <levelOfContainmentCode>UNDECLARED</levelOfContainmentCode> </allergen> <allergen> <allergenTypeCode>AC</allergenTypeCode> <levelOfContainmentCode>UNDECLARED</levelOfContainmentCode> </allergen>
Что я уже пробовал:
Я действительно пробовал все виды AddNamespace, но это, похоже, не работает.
Спасибо за любую помощь - очень ценю :)