C# - Невозможно получить значение узла из файла xml - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь получить внутренний текст из узла после загрузки файла XML. Я пробовал этот код с другим файлом, и он работал. Но здесь я не могу получить значения узла. Кто-нибудь может указать, что я делаю не так?

XML file - restaurant_reviews. xml

<?xml version="1.0"?>
<restaurants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.algonquincollege.com/onlineservice/reviews">
  <restaurant>
    <name>Laughing Man</name>
    <logo>
      <name>Visit the Laughing Man</name>
      <imagefile>laughing-man.gif</imagefile>
      <width unit="px">50</width>
      <height unit="px">200</height>
    </logo>
  </restaurant>
  <restaurant>
    <name>Gong&#x2019;s Asian Cuisine</name>
    <logo>
      <name/>
      <imagefile>gong-asian-cuisine.gif</imagefile>
      <width unit="px">150</width>
      <height unit="px">250</height>
    </logo>
  </restaurant>
</restaurants>

C# Код

List<string> names = new List<string>();            
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(HttpContext.Current.Server.MapPath(@"~/App_Data/restaurant_reviews.xml"));
XmlNodeList nodes = xmlDoc.SelectNodes("/restaurants/restaurant");
foreach (XmlNode itemNode in nodes)
{
   XmlNode titleNode = itemNode.SelectSingleNode("name");
   if (titleNode != null)
   {
      names.Add(titleNode.InnerText);
   }

}

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Хотя на этот вопрос уже есть принятый ответ, я все равно хотел добавить его, так как удаление пространств имен и манипулирование XML таким образом не подходят мне, но было добавлено по причине, которую я подозреваю.

Я считаю, что правильный подход - это тоже добавить XML Диспетчер пространства имен к вашему запросу XPath.

var nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsMgr.AddNamespace("r", "http://www.algonquincollege.com/onlineservice/reviews");

Затем в ваших SelectNodes и SelectSingleNodes вы добавляете пространство имен в запрос и передаете менеджер, как это.

XmlNodeList nodes = xmlDoc.SelectNodes("/r:restaurants/r:restaurant", nsMgr);

и

XmlNode titleNode = itemNode.SelectSingleNode("r:name", nsMgr);

Но если вы довольны другим решением и можете манипулировать им таким образом, тогда go для него, я думаю ,

1 голос
/ 01 апреля 2020

Проблема была с пространством имен. Благодаря @Sean в разделе комментариев я решил проблему. Спасибо @Presi также за то, что он указал на атрибут namespace.

List<string> names = new List<string>();
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(HttpContext.Current.Server.MapPath(@"~/App_Data/restaurant_reviews.xml"));
            var namespaceName = "ns";
            var namespacePrefix = string.Empty;
            XmlNamespaceManager nameSpaceManager = null;
            if (xmlDoc.LastChild.Attributes != null)
            {
                var xmlns = xmlDoc.LastChild.Attributes["xmlns"];
                if (xmlns != null)
                {
                    nameSpaceManager = new XmlNamespaceManager(xmlDoc.NameTable);
                    nameSpaceManager.AddNamespace(namespaceName, xmlns.Value);
                    namespacePrefix = namespaceName + ":";
                }
            }

            XmlNodeList nodes = xmlDoc.SelectNodes(string.Format("/{0}restaurants/{0}restaurant", namespacePrefix), nameSpaceManager);
            foreach (XmlNode itemNode in nodes)
            {
                XmlNode titleNode = itemNode.SelectSingleNode(namespacePrefix + "name", nameSpaceManager);
                if (titleNode != null)
                {
                    names.Add(titleNode.InnerText);
                }

            }
1 голос
/ 01 апреля 2020

Если вы удалите это xmlns="http://www.algonquincollege.com/onlineservice/reviews" в вашем xml, это сработает. Я не знаю почему, но xmlDoc.SelectNodes("/restaurants/restaurant"); не находит узлов с этим пространством имен xmlns.

Это код, с которым я работал, и он работает:

string xml = @"<?xml version=""1.0""?>
    <restaurants xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
    <restaurant>
    <name>Laughing Man</name>
    <logo>
    <name>Visit the Laughing Man</name>
    <imagefile>laughing-man.gif</imagefile>
    <width unit=""px"">50</width>
    <height unit=""px"">200</height>
    </logo>
    </restaurant>
    <restaurant>
    <name>Gong&#x2019;s Asian Cuisine</name>
    <logo>
    <name/>
    <imagefile>gong-asian-cuisine.gif</imagefile>
    <width unit=""px"">150</width>
    <height unit=""px"">250</height>
    </logo>
    </restaurant>
    </restaurants>";
List<string> names = new List<string>();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlNodeList nodes = xmlDoc.SelectNodes("/restaurants/restaurant");
foreach (XmlNode itemNode in nodes)
{
    XmlNode titleNode = itemNode.SelectSingleNode("name");
    if (titleNode != null)
    {
        names.Add(titleNode.InnerText);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...