0

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

我正在尝试使用 LINQ to XML 来实现这一点,因为我在 xPath 中找不到“LIKK”类型的运算符。我应该在 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 作为我的结果。我怎样才能做到这一点?

4

1 回答 1

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;

如果您只想测试字符串的第一部分,您仍然必须返回整个值并根据您的条件测试字符串。此查询检查文本“abc”是否出现在字符串的开头(将为空字符串返回 0),并将返回需要该条件的元素集合。

于 2012-11-28T17:08:22.940 回答