У меня есть файл. 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&du=000000000000015b00e26bd28904ee7f&product=0187&serverIpAddr=192.168.137.1&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&du=000000000000015b00e26bd28904ee7f&product=0187&serverIpAddr=192.168.137.1&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
Что я делаю не так?
Способ 0: проанализировать XML правильно
var doc = new XmlDocument(); doc.LoadXml(text); foreach(var n in doc.SelectNodes("//PsnUrl/text()")) urlsWrite.WriteLine(n);
Ваш образец XML кажется скопирован из древовидной структуры. Вот правильный контент. Обратите внимание, что & s кодируются как &. Если ваш источник этого не делает, вы можете сначала заменить их, например text.Replace("&", "&").
&
&
text.Replace("&", "&")
<?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&serverIpAddr=87.248.195.254&country=us&downloadType=ob&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&serverIpAddr=87.248.195.254&country=us&downloadType=ob&q=1817303785a54ecb464ab93233801c33225a5dae976d075973acb9669874c74b</PsnUrl> <LocalUrl></LocalUrl> </PsnRecord> </PsnRecords>
Если XML не имеет неправильной формы, не играйте со струнами самостоятельно.
Способ 1: вам нужно удалить <PsnUrl> и </PsnUrl>.
<PsnUrl>
</PsnUrl>
foreach (string s in links) urlsWrite.WriteLine(s.Replace("<PsnUrl>", string.Empty).Replace("</PsnUrl>", string.Empty));
Способ 2: mactches, links, mats ??? пожалуйста, разместите актуальный код, который компилируется. Ваш вызов замены заключает URL-адрес в тег !? Это противоречит тому, чего вы хотите достичь.
mactches
links
mats
foreach (Match matc in mactches) urlsWrite.WriteLine(matc.Value);