Как я могу отобразить XML данные, используя C# - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь отобразить атрибут id элемента канала с именем id, внутренний текст тега display-name и внутренний текст значка, который иногда содержится внутри элемента канала.

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv generator-info-name="xmltv.co.uk" source-info-name="xmltv.co.uk">
  <channel id="0052a71acac348ff93f5680aa9c125eb">
    <display-name>2910</display-name>
  </channel>
  <channel id="00da025711e82cf319cb488d5988c099">
    <display-name>Sony Movies</display-name>
  </channel>
  <channel id="00dfea977320f17bb419abaa1f079f39">
    <display-name>Good Food</display-name>
    <icon src="/images/channels/00dfea977320f17bb419abaa1f079f39.png"/>
  </channel>
<channel id="018202232e044b504f9dc5263617d496">
    <display-name>The Box</display-name>
    <icon src="/images/channels/018202232e044b504f9dc5263617d496.png"/>
  </channel>

Я пытался использовать этот код C# код ниже, но второй, если дать мне ошибку об отсутствии ссылки на объект.

 XmlDocument doc = new XmlDocument();

        doc.Load(xmlLocation);



        //dispaly the  nodes
        foreach (XmlNode node in doc.DocumentElement.ChildNodes) 
        {

            //get the channel
            if (node.Name.Equals("channel"))
            {

                Debug.WriteLine("Channel Name : " + node.ChildNodes[0].Name.ToString()); //or loop through its children as well
                //Debug.WriteLine("Channel Name : " + node.AttributeCount.ToString()); //or loop through its children as well

//get the icon element
                  if(node.ChildNodes[1].Name != null)
                    Debug.WriteLine("Channel Name : " + node.ChildNodes[1].Name.ToString());


            }

        }

Ответы [ 2 ]

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

Хотя XDocument / XElement и LinQ to XML - это новая тенденция,

следит за вашей реализацией и добавляет к ней только одну функцию (используя XPATH для запроса содержимого документа);

Найдите код для извлечения названий каналов и соответствующих им URL-адресов источника значков (если они есть)

Применяя SelectNodes и SelectSingleNode, API выполняет итерации по узлам для нас.

// Select all the XML elements whose name is "channel"
foreach (XmlNode channelNode in doc.DocumentElement.SelectNodes("channel"))
{
    // check if a child element with the name "display-name" exists
    XmlNode displayNameNode = channelNode.SelectSingleNode("display-name");
    if (displayNameNode != null)
    {
        // If yes, print the inner text
        Debug.WriteLine("Channel Name : " + displayNameNode.InnerText);
    }

    // then check if the icon node exists
    XmlNode iconNode = channelNode.SelectSingleNode("icon");

    if (iconNode != null)
    {
        // and check if it has an attribute with the name "src"
        if (iconNode.Attributes["src"] != null)
        {
            // and if yes, print out its value
            Debug.WriteLine("    Icon Src : " + iconNode.Attributes["src"].Value);
        }
    }
}
0 голосов
/ 14 апреля 2020

Сначала вам нужно преобразовать строку в XML и загрузить ее в XmlDocument, а затем использовать XPath, как показано ниже. Простая программа, которую вы можете запустить в dotnetfiddle. net, чтобы проверить это.

using System;
using System.Xml;

public class Program
{
    public static void Main()
    {
        string xmlString = "<tv generator-info-name='xmltv.co.uk' source-info-name='xmltv.co.uk'>   <channel id='0052a71acac348ff93f5680aa9c125eb'> <display-name>2910</display-name>   </channel>   <channel id='00da025711e82cf319cb488d5988c099'>     <display-name>Sony Movies</display-name>   </channel>   <channel id='00dfea977320f17bb419abaa1f079f39'>     <display-name>Good Food</display-name>     <icon src='/images/channels/00dfea977320f17bb419abaa1f079f39.png'/>   </channel> <channel id='018202232e044b504f9dc5263617d496'>     <display-name>The Box</display-name>     <icon src='/images/channels/018202232e044b504f9dc5263617d496.png'/>   </channel></tv>";
        XmlDocument xmltest = new XmlDocument();
        xmltest.LoadXml(xmlString);
        XmlNodeList itemNodes = xmltest.SelectNodes("//tv/channel");
        foreach(XmlNode itemNode in itemNodes)
        {
                if (itemNode!= null) {
            Console.WriteLine(string.Format("Id:{0}", (itemNode as XmlElement).GetAttribute("id")));
            }
        }
    }

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