如何搜索包含特定文本的XML节点?

时间:2012-11-28 16:44:32

标签: vb.net linq linq-to-xml

我有一个XML文档,里面有多个嵌套节点。它的结构不固定。我想根据用户传递的值过滤XML。即如果在所有1000个节点中,如果5个节点包含以' xyz'开头的值,那么我想要检索这5个节点。

我正在尝试使用LINQ to XML来实现这一点,因为我找不到' LIKK' xPath中的运算符类型。我应该在LINQ中写什么类型的查询?

到目前为止,我正在做类似下面的事情:

        dim FilterString as string  = "abc"
        Dim doc = New XDocument(Linq.XElement.Parse(objXML.DocumentElement.OuterXml))

        Dim query = doc.Elements()
        query = From e In doc.Elements()
                Where e.Value.ToUpper.StartsWith(FilterString.ToUpper)
                Select e
        Dim sb As New StringBuilder
        For Each result In query
            sb.AppendLine(result)
        Next

示例XML将如下所示:

<root>
<node>
<p1>abcxys</p1>
<p2>anc</p2>
<c1>
   <c2>abcggh</c2>
   <c3>123</c3>
</c1>
</node>
</root>

我希望root / node / p1和root / node / c1 / c2作为我的结果。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

如果它们可以在任何节点中,那么您将不得不查询每个节点,没有什么可以过滤。这可能是一个非常昂贵的过程。

string userInput = "abc";

var xDoc = XDocument.Load(@"C:\Test\Xml.xml");
var q = from e in xDoc.Descendants()
             where e.Value.IndexOf(userInput) == 1
             select e;

如果您只想测试字符串的第一部分,您仍然必须返回整个值并根据您的条件测试字符串。 此查询检查文本&#34; abc&#34;发生在字符串的开头(对于空字符串将返回0)并将返回需要该条件的元素集合。