2

我有一个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();
4

2 回答 2

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())
                 );
于 2012-06-29T14:38:52.460 回答
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)]");
于 2012-06-29T19:38:33.080 回答