首页 > 解决方案 > 哪种方式适合在没有 XSLT 的情况下使用 ASP.NET 控制台应用程序进行动态 XML 转换?

问题描述

首先,我在 ASP.NET 中成功创建了 Web API。API 从另一台服务器获取 XML。我发现适合 XML 所有格式更改的。

我试图应用 belove 逻辑:

 using (XmlReader reader = XmlReader.Create("XML.xml"))
 {
    //String starttime,Endtime;
    while (reader.Read())
    {
        // Only detect start elements.
        if (reader.IsStartElement())
        {
            switch (reader.Name)
            {                           
                   case "EventInfo":
                   // Detect this element.
                   Console.WriteLine("Start <content> element.  ");
                   Console.WriteLine();
                   break;
             }
         }
     }
}

这样只有一个文件转换成另一个文件。我尝试一次创建多个文件转换为另一种格式。

我从 Web API 提供了以下格式数据,这是一个普通的 XML 格式使用:

<EventInfo>
   <Event>
        <EventId>1</EventId>   
        <EventName>shedule-1</EventName>   
        <EventText>ch1 Channel Description</EventText> 
        <StartTime>00:00:00</StartTime>
        <Duration>00:30:00</Duration>
        <Date>20.06.2019</Date>
   </Event>
<EventInfo>

我在标题标签中应用逻辑,它的开始时间+持续时间是我的结束时间,我在图块标签中显示 EventName 和 Time。它都是动态的。

这里它的 ROKU 格式 XML:

<Content>

      //Here i only print the HH-MM.
      <item title="00:00 - 00:30 shedule-1" LIVE="true" streamformat="mov" description="ch1 Channel Description" realeasedate="20.06.2019" description-color="0xC36419"/>

<Content>

任何人都知道哪种是转换 XML 的最佳方法。谢谢你。

标签: asp.netxmlconsole-applicationrokubrightscript

解决方案


请查看以下针对您的案例的解决方案:

1) 将 WebAPI Xml 反序列化为 C# 对象(例如事件)。

2) 使用 xml Linq 从(事件)C# 对象到所需的 xml 格式。

点击这里- 在线执行

第 1 步:创建一个类以对输入的 xml 结构进行脱轨。

public class Event
{
    [XmlElement]
    public string EventId { get; set; }
    [XmlElement]
    public string EventName { get; set; }
    [XmlElement]
    public string EventText { get; set; }
    [XmlElement]
    public string StartTime { get; set; }
    [XmlElement]
    public string Duration { get; set; }
    [XmlElement]
    public string Date { get; set; }
}

第 2 步:将 WebAPI Xml 字符串反序列化为 C# 对象并使用 xml linq 重新格式化。

string sXml = @"<EventInfo>
                           <Event>
                                <EventId>1</EventId>   
                                <EventName>shedule-1</EventName>   
                                <EventText>ch1 Channel Description</EventText> 
                                <StartTime>00:00:00</StartTime>
                                <Duration>00:30:00</Duration>
                                <Date>20.06.2019</Date>
                           </Event>
                        </EventInfo>";

        using (TextReader oReader = new StringReader(sXml))
        {
            // Deserialize Xml string to c# object
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Event>), new XmlRootAttribute("EventInfo"));
            List<Event> lstEvents = (List<Event>)xmlSerializer.Deserialize(oReader);

            if (lstEvents != null)
            {
                // Restructure the C# object to ROKU Xml Format using Xml Linq
                XElement oResult = new XElement("Content", lstEvents.Select(t =>
                                new XElement("item",
                                    new XAttribute("title", string.Format("{0} - {1} {2}", Convert.ToDateTime(t.StartTime).ToString("HH:mm"), Convert.ToDateTime(t.Duration).ToString("HH:mm"), t.EventName)),
                                    new XAttribute("LIVE", "true"),
                                    new XAttribute("streamformat", "mov"),
                                    new XAttribute("description", t.EventName),
                                    new XAttribute("realeasedate", t.Date),
                                    new XAttribute("description-color", "0xC36419")
                                    )));
                // Saving the output as seperate xml file
                oResult.Save("ROKU.xml");                   
            }
            else
            {
                Console.WriteLine("No Events Found");
            }

        }
}

推荐阅读