Проблема формата XML-тега в c # - PullRequest
0 голосов
/ 03 июля 2018

Использую приведенный ниже код для создания XML-файла из URL-адреса RSS-канала, но данные не отображаются в формате тега в XML-файле.

В XML-файле < символ отображается как &lt; и > символ отображается как &gt;

Пожалуйста, помогите мне в этом. Это мой код.

public bool DownloadFeed(){

    string user = "xxx";
    string password = "pwd";

    WebClient web = new WebClient();
    System.Net.WebClient wc = new System.Net.WebClient();
    wc.Credentials = new System.Net.NetworkCredential(user, password);
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 | 
                                                        SecurityProtocolType.Tls | 
                                                        SecurityProtocolType.Tls11 | 
                                                        SecurityProtocolType.Tls12;
    wc.DownloadFile(@"https://Entered RSS Feed URL here", @"H:\import\Test.xml");
    return true;
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Хотя другой ответ уже принят, в вашем коде нет ничего плохого, и предлагаемый ответ на самом деле не помогает вам. И просто чтобы быть ясным, я не критикую Алекса, который не имел возможности разобраться с этим, так как соответствующая информация не была предоставлена ​​(но она есть в ОП next и впоследствии вопросов). Preethi, вы просто не понимаете, что вы смотрите в загруженном файле RSS.

RSS - это формат на основе XML. Взгляните на пример на этой странице, потому что он использует простой текст. Загружаемый файл будет в этом формате. Но я предполагаю (основываясь на этом вопросе и ваших следующих двух вопросах по той же теме), что файл RSS, на который вы указываете, содержит в данных HTML, а не простой текст.

Проблема в том, что HTML довольно часто использует < и >, поэтому вы заметите, что он делает с ними что-то странное - он превращает их в &lt; и &gt;. Это необходимо сделать, потому что значение, содержащее HTML, находится в определении XML файла RSS.

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

string hello="hello"world";

потому что C # видит открывающую двойную кавычку и затем ищет закрывающую двойную кавычку, и находит слово после слова hello. Поэтому вам нужно экранировать этого символа, чтобы он понял, что это не конец строки. Вы должны сделать:

string hello="hello\"world";

То же самое относится и к XML. Формат XML полностью зависит от символов < и > (среди прочего). Так что, если бы у меня была какая-то поговорка XML:

<item>
  <title>Example entry</title>
</item>

это было бы хорошо; но если я просто заменил простой текст «Пример записи» на кусок HTML:

<item>
  <title><html><td bgcolor="#f0f0f0" width=20% valign=top></html></title>
</item>

Тогда это будет проблемой, потому что значение внутри тега title будет вызывать проблемы. Одна из проблем заключается в том, что это не правильно сформированный XML (например, потому что нет закрывающего тега td и атрибуты не должны заключаться в кавычки; поскольку HTML является , а не XML) , Другая проблема заключается в том, что это нарушит определение формата RSS, поскольку тег «title» должен содержать значение, а не другие теги. Поэтому нам нужно экранировать значение в теге title следующим образом:

<item>
  <title>&lt;html&gt;&lt;td bgcolor="#f0f0f0" width=20% valign=top&gt;&lt;/html&gt;</title>
</item>

И это будет то, что вы видите в своем файле RSS.

Поэтому я считаю, что ответ, который вы на самом деле искали, заключался в том, что вам нужно обработать возвращаемый файл RSS как файл XML (попробуйте использовать XmlDocument.Load (uri) или XDocument .Load (uri) с URL вашего RSS-канала.

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

Надеюсь, это поможет.

0 голосов
/ 03 июля 2018

Ваша строка в файле очищена. Вы можете скачать его в виде строки, декодировать, а затем сохранить в файл:

var xmlString = HttpUtility.HtmlDecode(wc.DownloadString(@"https://Entered RSS Feed URL here"));
File.WriteAllText(@"H:\import\Test.xml", xmlString);
...