[英]Not finding elements in xml even when attribute property is present
鑒於以下 XML
<?xml version="1.0" encoding="utf-8" ?>
<headtags>
<tags page-path-from-root="Models/ModelDashboard">
<tag type="title" value=""></tag>
<tag type="meta" name="keyword" content=""></tag>
<tag type="meta" name="description" content=""></tag>
<tag type="meta" name="author" content=""></tag>
<tag type="link" rel="canonical" href="" />
<tag type="meta" property="og:locale" content="en_US" />
<tag type="meta" property="og:type" content="website" />
<tag type="meta" property="og:title" content="Model Dashboard" />
<tag type="meta" property="og:description" content="Dashboard of values for a {model}" />
<tag type="meta" property="og:site_name" content="Car Collector Data" />
<tag type="meta" property="article:publisher" content="Group LLC" />
<tag type="meta" property="article:author" content="me" />
</tags>
<tags page-path-from-root="Identity/Account/Manage/SiteStatus">
<tag type="title" value=""></tag>
<tag type="meta" name="keyword" content=""></tag>
<tag type="meta" name="description" content=""></tag>
<tag type="meta" name="author" content=""></tag>
<tag type="link" rel="canonical" href="" />
<tag type="meta" property="og:locale" content="en_US" />
<tag type="meta" property="og:type" content="" />
<tag type="meta" property="og:title" content="" />
<tag type="meta" property="og:description" content="" />
<tag type="meta" property="og:url" content="" />
<tag type="meta" property="og:site_name" content="" />
<tag type="meta" property="article:publisher" content="" />
<tag type="meta" property="article:author" content="" />
</tags>
</headtags>
以下方法一直有效,直到最后一行,在查找屬性值包含“og:”的元素時總是出錯,顯然有六個。 結腸是否必須逃脫? 我是這么認為的,但刪除它,該行仍然在 Contains("og") 上失敗
public List<XElement> GetOpenGraphTagsForPage(string page)
{
var doc = XDocument.Load(_metaTagXmlFile);
var metaTags = doc.Descendants("headtags")
.Elements("tags")
//page value is modeldashboard
.Where(u => u.Attribute("page-path-from-root").Value.ToLower().Contains(page))
.Elements("tag") //[@type='meta'] didn't work in Xname to eliminate next line...why?
.Where(u => u.Attribute("type")?.Value == "meta")
.Where(u => u.Attribute("property").Value.Contains("og:"))
.ToList();
return metaTags;
}
另外,為什么不這樣做(錯誤說“[”字符是不允許的)
.Elements("tag[@type='meta']")
產生與此相同的結果
.Elements("tag") //[@type='meta'] didn't work in Xname to eliminate next line...why?
.Where(u => u.Attribute("type")?.Value == "meta")
第一個中的 Xpath 要求同樣的事情
由於沒有人回答這個問題,我終於解決了這個問題。 這是答案。 我使用 XPath 而不是 LINQ。
要創建正確的 XPath,我們需要使用 XPath 中的 contains 和 starts-with 方法。
public IEnumerable<XElement> GetOpenGraphTagsForPage(string page)
{
var doc = XDocument.Load(_metaTagXmlFile);
var ogTags = doc.XPathSelectElements($"//headtags//tags[contains(@page-path-from-root, '{page}')]//tag[@type='meta'][starts-with(@property, 'og')]");
return ogTags;
}
我仍然想知道等效的 LINQ,所以如果您有解決方案,請發布另一個答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.