Проблема пространства имен XML C # - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть XML, и я пытаюсь получить узел из XmlDocument, но из-за некоторых проблем с пространством имен он не возвращает мне нужный мне узел.

Ниже приведен мой XML.

<?xml version="1.0" encoding="iso-8859-1"?>
<message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.origoservices.com">
  <content>
    <application>
      <personal_client id="pc1">
        <title>Mr</title>
        <forenames>Test</forenames>
        <surname>SurName</surname>
        <sex>Male</sex>
      </personal_client>
      <personal_client id="pc2">
        <title>Mr</title>
        <forenames>Test</forenames>
        <surname>SurName</surname>
        <sex>Male</sex>
      </personal_client>
      <personal_client id="pc3">
        <title>Mr</title>
        <forenames>Test</forenames>
        <surname>SurName</surname>
        <sex>Male</sex>
      </personal_client>
    </application>
  </content>
</message>

Ниже приведен код C #, который я использую для получения всех personal_client узлов из указанного выше XML.

XmlDocument XMLDoc = new XmlDocument();
XMLDoc.PreserveWhitespace = true;
XMLDoc.Load("XML Loaded successfully");

XmlNamespaceManager nsmgr = new XmlNamespaceManager(XMLDoc.NameTable);
nsmgr.AddNamespace("origo", "http://www.origoservices.com");
nsmgr.PushScope();

XmlNodeList xnList = XMLDoc.SelectNodes("//origo:message/m_content/application/personal_client", nsmgr);

Все время, когда он возвращает 0 узловПожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вот еще один способ

//Using the file path
var clients = XDocument.Load(xmlFilePath)
               .Descendants(XName.Get("personal_client", "http://www.origoservices.com"));

//Using the file content
var clients = XDocument.Parse(xmlFileContent)
               .Descendants(XName.Get("personal_client", "http://www.origoservices.com"));

И таким образом вы можете избежать помещения пространства имен

.Descendants().Where(x => x.Name.LocalName == "personal_client");
1 голос
/ 07 ноября 2019

Необходимо указать пространство имен для каждого элемента запроса, поскольку пространство имен по умолчанию также применяется к подузлам. Я поместил ваш образец XML в файл с именем XmlFile1.xml и создал следующий образец:

var XMLDoc = new XmlDocument();
XMLDoc.Load("XmlFile1.xml");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(XMLDoc.NameTable);
nsmgr.AddNamespace("origo", "http://www.origoservices.com");
XmlNodeList xnList = XMLDoc.SelectNodes("//origo:message/origo:content/origo:application/origo:personal_client", nsmgr);

Этот код извлекает 3 узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...