Member 14045539 Ответов: 2

Проблемы чтения сложного 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, но это, похоже, не работает.

Спасибо за любую помощь - очень ценю :)

2 Ответов

Рейтинг:
2

Richard Deeming

Попробуйте передать диспетчер пространств имен в SelectSingleNode метод:

var allergen = node.SelectSingleNode("tradeItem/tradeItemInformation/extension/allergen_information:allergenInformationModule/allergenRelatedInformation/allergenSpecificationAgency", nsmgr).InnerText;
узел XmlNode.Метод SelectSingleNode (System.Xml) | Microsoft Docs[^]


Member 14045539

Это сработало! Просто фантастика! Большое вам спасибо!

Рейтинг:
0

Member 14045539

Решение Ричардса сработало, просто добавив ссылку на пространство имен в конец SelectSingleNode...