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>

string に 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

この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 のない項目がある場合、またはその値がである場合は、xpath 式に""追加して結果からそれらを削除できます。and . != ''

ライブラリは初期段階にあるため、ITEM_XML_PATH が非常に複雑な場合、これは機能しない可能性があります。

更新:含まれている Linq-to-Xml XPath バージョンを使用して、Pawel のコメントに基づいています。

root.XPathSelectElements(
    "//item[contains('" + urlSearchPattern + "', @urlSearchPattern)]");
于 2012-06-29T19:38:33.080 に答える
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 に答える