我有一個包含處理指令的 XML 實體。我想要一個特定的(schematron 宣告):
<?xml-model href="../../a/b/c.sch" schematypens="http://purl.oclc.org/dsdl/schematron"?>
可能存在也可能不超過這些處理指令,所以我不能依賴它在 DOM 中的位置;另一方面,保證只有一個(或沒有)這樣的 Schematron 檔案參考。因此,我是這樣理解的:
XProcessingInstruction p = d.Nodes().OfType<XProcessingInstruction>()
.Where(x => x.Target.Equals("xml-model") &&
x.Data.Contains("schematypens=\"http://purl.oclc.org/dsdl/schematron\""))
.FirstOrDefault();
在給出的例子中,內容p.Data是字串
href="../../a/b/c.sch" schematypens="http://purl.oclc.org/dsdl/schematron"
我需要提取通過@href 指定的路徑(即在這個例子中我想要字串../../a/b/c.sch)而不帶雙引號。換句話說:我需要在href="next 之后和之前的子字串"。我正在嘗試使用 LINQ 實作我的目標:
var a = p.Data.Split(' ').Where(s => s.StartsWith("href=\""))
.Select(s => s.Substring("href=\"".Length))
.Select(s => s.TakeWhile(c => c != '"'));
我原以為這給了我一個,然后我可以通過此處IEnumerable<char>描述的一種方式將其轉換為字串,但事實并非如此:根據 LINQPad,我似乎得到了一個我無法將其轉換為細繩。IEnumerabale<IEnumerable<char>>
如何使用 LINQ 正確完成此操作?也許我最好在 LINQ 中使用正則運算式?
編輯:在輸入這??個之后,我想出了一個可行的解決方案,但它似乎很不優雅:
string a = new string
(
p.Data.Substring(p.Data.IndexOf("href=\"") "href=\"".Length)
.TakeWhile(c => c != '"').ToArray()
);
有什么更好的方法?
uj5u.com熱心網友回復:
試試這個:
var input = @"<?xml-model href=""../../a/b/c.sch"" schematypens=""http://purl.oclc.org/dsdl/schematron""?>";
var match = Regex.Match(input, @"href=""(.*?)""");
var url = match.Groups[1].Value;
這給了我../../a/b/c.sch。url
請不要將 Regex 用于一般的 XML 決議,但對于這種情況,它很好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/463220.html
上一篇:如何將值放入串列型別欄位
