查找XmlNode,其中属性值包含在字符串中

时间:2012-06-29 14:20:52

标签: c# xml linq xml-parsing

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

2 个答案:

答案 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)]");