我有一个xml文件......
<?xml version="1.0" encoding="UTF-8"?>
<items defaultNode="1">
<default contentPlaceholderName="pageContent" template="" genericContentItemName="" />
<item urlSearchPattern="connections-learning" contentPlaceholderName="pageContent" template="Connections Learning Content Page" genericContentItemName="" />
<item urlSearchPattern="online-high-school" contentPlaceholderName="pageContent" template="" genericContentItemName="" />
</items>
我正在尝试找到字符串urlSearchPattern
中包含urlSearchPattern属性的第一个节点。我遇到问题的地方是找到属性包含在字符串值中的节点,而不是字符串值包含在属性中。
到目前为止,这是我的尝试。这将找到firstOrDefault节点,其中字符串值包含在属性中(我需要相反)...
string urlSearchPattern = Request.QueryString["aspxerrorpath"];
MissingPageSettingsXmlDocument missingPageSettingsXmlDocument = new MissingPageSettingsXmlDocument();
XmlNode missingPageItem = missingPageSettingsXmlDocument.SelectNodes(ITEM_XML_PATH).Cast<XmlNode>().Where(item => item.Attributes["urlSearchPattern"].ToString().ToLower().Contains(urlSearchPattern)).FirstOrDefault();
答案 0 :(得分:1)
嗯......然后反转!
var result = missingPageSettingsXmlDocument
.SelectNodes(ITEM_XML_PATH)
.Cast<XmlNode>()
.FirstOrDefault(
m => m.Attributes != null &&
m.Attributes["urlSearchPattern"] != null &&
urlSearchPattern.Contains(m.Attributes["urlSearchPattern"].ToString().ToLower())
);
答案 1 :(得分:1)
使用此Xml Library,并提供您的ITEM_XML_PATH,如下所示://item
XElement root = XElement.Load(file); // or .Parse(string)
var matches = root.XPath("//item[contains({0}, {1}, false)]",
urlSearchPattern, new NodeSet("@urlSearchPattern"));
false表示使用.ToLower()
转换所有值并使用节点集反转模式,它将搜索pattern.Contains(nodeset)
。
如果您的项目没有urlSearchPattern或其值为""
,则可以将and . != ''
添加到xpath表达式中以将其从结果中删除。
图书馆还处于起步阶段,所以如果您的ITEM_XML_PATH真的很复杂,这可能不适合您。
更新:根据Pawel的评论,使用附带的Linq-to-Xml XPath版本:
root.XPathSelectElements(
"//item[contains('" + urlSearchPattern + "', @urlSearchPattern)]");