0

我有一个审计/日志系统,它使用原始 XML 来表示应用程序执行的操作。我想通过在应用程序的 SQL Server 数据库的表中使用 XML 列来大大改进这个系统。

表中的每一行都将包含一个日志条目,并且每个条目都应包含一个或多个标签,这些标签用于以语义方式描述操作,允许我以匹配应用程序审计需求的方式进行搜索,例如:

<updateInvoice id="5" userId="7" /><fieldUpdate name="InvoiceDate" /><invoice /><update />

<deleteInvoice id="5" userId="6" /><invoice /><delete />

我的意图是通过指定标签和属性的组合来包含或排除行,从而从该表中返回行集(例如“包含带有标签的所有行,invoice但排除带有属性的行userId='7'”,或“包含带有标签的所有行,invoice但排除行带标签delete

我希望通过使用简单过滤器结构的组合以编程方式来表示我希望包含或排除行的标记和属性的组合。

我使用的结构如下所示:

enum FilterInclusion { Include, Exclude };

public struct Filter
{
    FilterInclusion Inclusion;
    string TagName;
    string? AttributeName;
    object? AttributeValue;
}

我的目标是接受其中的一组并生成一个查询,该查询返回与任何单个包含过滤器匹配的任何行,而不匹配任何单个排除过滤器。

我应该并且可以将这个布尔逻辑编码到生成的 XPath 本身中,还是我正在查看在输出的查询中有多个 SELECT 语句?我是 XQuery 的新手,感谢您提供任何帮助。谢谢!

4

1 回答 1

1

我不确定这是否是您要查找的内容,但是要过滤 XML 方法中的节点,您可以使用括号[]. 例如,要选择元素foo,但只过滤那些具有bar您将使用 XPath 之类的属性的元素/foo[@bar]。如果您想要那些@bar具有值为 5 的属性,请使用/foo[@bar=5]. 如果要选择foo具有您使用的元素的元素。bar/foo[bar]

declare @t table (x xml);
insert into @t (x) values 
(N'<foo bar="abc"/>');
insert into @t (x) values 
(N'<foo bar="5"/>');
insert into @t (x) values 
(N'<foo id="1"><bar id="2"/></foo>');
select * from @t;

select c.value(N'@bar', N'varchar(max)') 
from @t cross apply x.nodes(N'/foo[@bar]') t(c)

select c.value(N'@bar', N'varchar(max)') 
from @t cross apply x.nodes(N'/foo[@bar=5]') t(c)
select c.value(N'@id', N'int') 
from @t cross apply x.nodes(N'/foo[bar]') t(c)

我试图在您的帖子中展示 XML 片段中的示例,但这些示例过于无结构,无法制作有用的示例。

于 2009-08-29T04:48:52.697 回答