как прочитать файл XML, получить в нем все URL-ссылки и сохранить их в файл TXT? C# - PullRequest
1 голос
/ 02 августа 2020

У меня есть файл. XML (это журнал, созданный моей программой) со следующим текстом:

<?xml version="1.0" encoding="utf-8"?>
<PsnRecords>
  <PsnRecord>
    <Names></Names>
    <PsnUrl>http://gs2.ww.prod.dl.playstation.net/gs2/ppkgo/prod/CUSA05330_00/108/f_acb1a312a982305e284718898b3dade6afb395e6718d836b1d7b1e1aa1873800/f/EP0953-CUSA05330_00-BRAWLHALLAEUROPE-A0403-V0100-DP.pkg</PsnUrl>
    <LocalUrl>C:\Users\Betrisa\Desktop\Shared\EP0953-CUSA05330_00-BRAWLHALLAEUROPE-A0403-V0100-DP.pkg</LocalUrl>
    <isLixian>false</isLixian>
    <LixianUrl></LixianUrl>
  </PsnRecord>
  <PsnRecord>
    <Names></Names>
    <PsnUrl>http://gs2.ww.prod.dl.playstation.net/gs2/ppkgo/prod/CUSA05330_00/108/f_acb1a312a982305e284718898b3dade6afb395e6718d836b1d7b1e1aa1873800/f/EP0953-CUSA05330_00-BRAWLHALLAEUROPE-A0403-V0100.pkg?downloadId=0000015b&amp;du=000000000000015b00e26bd28904ee7f&amp;product=0187&amp;serverIpAddr=192.168.137.1&amp;r=00000000</PsnUrl>
    <LocalUrl></LocalUrl>
    <isLixian>false</isLixian>
    <LixianUrl></LixianUrl>
  </PsnRecord>
  <PsnRecord>
    <Names></Names>
    <PsnUrl>http://ic.97f46e00.060798.gs2.sonycoment.loris-e.llnwd.net/gs2/ppkgo/prod/CUSA05330_00/108/f_acb1a312a982305e284718898b3dade6afb395e6718d836b1d7b1e1aa1873800/f/EP0953-CUSA05330_00-BRAWLHALLAEUROPE-A0403-V0100.pkg?downloadId=0000015b&amp;du=000000000000015b00e26bd28904ee7f&amp;product=0187&amp;serverIpAddr=192.168.137.1&amp;r=00000001</PsnUrl>
    <LocalUrl></LocalUrl>
    <isLixian>false</isLixian>
    <LixianUrl></LixianUrl>
  </PsnRecord>
</PsnRecords>

Я хочу получить все URL-ссылки и сохранить их в .TXT файл. Я пробовал двумя способами, но они не сработали:

Способ 1: использование Split (Результат: URL)

        private void button1_Click(object sender, EventArgs e)
        {
            string paths = Application.StartupPath + @"\DataFiles\DataHistory.xml";
            string resPaths = Application.StartupPath + @"\DataFiles\Links.txt";
            StreamWriter urlsWrite = File.CreateText(resPaths);


            var text = System.IO.File.ReadAllText(paths);
            var links = text.Split("\t\n ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Where(s => s.StartsWith("<PsnUrl>http://") || s.StartsWith("<PsnUrl>https://"));

            foreach (string s in links)
            {
            urlsWrite.WriteLine(s);     
            }
            
        }

Способ 2: использование Regex (результат ничего !!)

        private void button1_Click(object sender, EventArgs e)
        {
            string paths = Application.StartupPath + @"\DataFiles\DataHistory.xml";
            string resPaths = Application.StartupPath + @"\DataFiles\Links.txt";
            StreamWriter urlsWrite = File.CreateText(resPaths);


            var text = System.IO.File.ReadAllText(paths);
            var regex = new Regex(@"\b(?:http?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            MatchCollection mactches = regex.Matches(text);
            
            foreach (string matc in links)
            {
            text = text.Replace(matc.Value, "<PsnUrl>"+matc.Value+"</PsnUrl>");
            urlsWrite.WriteLine(mats);     
            }
        }

Мне нужен файл .TXT с чистыми URL-адресами, например:

https://xxxxxxxxxxxxxx
http://xxxxxxxxxxxxxx
https://xxxxxxxxxxxxxx
https://xxxxxxxxxxxxxx
https://xxxxxxxxxxxxxx
https://xxxxxxxxxxxxxx

Что я делаю не так?

1 Ответ

0 голосов
/ 02 августа 2020

Способ 0: проанализировать XML правильно

var doc = new XmlDocument();
doc.LoadXml(text);
foreach(var n in doc.SelectNodes("//PsnUrl/text()"))
    urlsWrite.WriteLine(n);

Ваш образец XML кажется скопирован из древовидной структуры. Вот правильный контент. Обратите внимание, что & s кодируются как &amp;. Если ваш источник этого не делает, вы можете сначала заменить их, например text.Replace("&", "&amp;").

<?xml version="1.0" encoding="UTF-8"?>
<PsnRecords>
    <PsnRecord>
        <Names/>
        <PsnUrl>http://gs2.ww.prod.dl.playstation.net/gs2/acpkgo/prod/CUSA00803_00/9/f_72955662ebee69bf3f1bbec8b1f1dfef1ed000acb6f96046b394d69fc8551fe4/f/UP0002-CUSA00803_00-CODAWDIGITALPACK.pkg?downloadId=000000ab&amp;serverIpAddr=87.248.195.254&amp;country=us&amp;downloadType=ob&amp;q=1817303785a54ecb464ab93233801c33225a5dae976d075973acb9669874c74b</PsnUrl>
        <LocalUrl></LocalUrl>
    </PsnRecord>
    <PsnRecord>
        <Names/>
        <PsnUrl>http://gs2.ww.prod.dl.playstation.net/gs2/appkgo/prod/CUSA00803_00/3/f_6ee0d43dc4ea9a53a9f3d83fe26c7afcfadca8d17795762ab81cb2ddc6086776/f/UP0002-CUSA00803_00-CODAW00000000000_0.pkg?downloadId=000000ac&amp;serverIpAddr=87.248.195.254&amp;country=us&amp;downloadType=ob&amp;q=1817303785a54ecb464ab93233801c33225a5dae976d075973acb9669874c74b</PsnUrl>
        <LocalUrl></LocalUrl>
    </PsnRecord>
</PsnRecords>

Если XML не имеет неправильной формы, не играйте со струнами самостоятельно.

Способ 1: вам нужно удалить <PsnUrl> и </PsnUrl>.

foreach (string s in links)
    urlsWrite.WriteLine(s.Replace("<PsnUrl>", string.Empty).Replace("</PsnUrl>", string.Empty));

Способ 2: mactches, links, mats ??? пожалуйста, разместите актуальный код, который компилируется. Ваш вызов замены заключает URL-адрес в тег !? Это противоречит тому, чего вы хотите достичь.

foreach (Match matc in mactches)
    urlsWrite.WriteLine(matc.Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...