gpt4 book ai didi

xml - Xpath使用属性作为xml文件中的变量,其中有一个命名空间

转载 作者:行者123 更新时间:2023-12-04 16:56:06 25 4
gpt4 key购买 nike

如果我们有这个 xml 文件并且我想使用属性 Author 作为变量来获取标题

<bookstore>
<book author="Tommy">
<title>Emma</title>
</book>
</bookstore>

我知道我必须写这个
string au = "Tommy";
string query = String.Format("//bookstore/book[@author={0}]/title", au);

如果我们也有这个例子,我想得到标题
<bk:bookstore xmlns:bk="http://www.example.com/">
<book author="Tommy">
<title>Emma</title>
</book>
</bk:bookstore>

我知道我必须写这个
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("bk", "http://www.test.com/");
XmlNodeList elements0 = xml.SelectNodes("//bk:bookstore/book/title", nsmgr);

但是如果我有第二个例子,我不知道该怎么办,我也想使用属性 Author 作为变量。我试过这个
string au = "Tommy";
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("bk", "http://www.test.com/");
XmlNodeList elements0 = xml.SelectNodes("//bk:bookstore/book[@author={0}]/title", au, nsmgr);

或这个
XmlNodeList elements0 = xml.SelectNodes("//bk:bookstore/book[@author={0}]/title", nsmgr, au); 

或这个
XmlNodeList elements0 = xml.SelectNodes("//bk:bookstore/book[@author={1}]/title", nsmgr, au); 

但它不起作用。
有人可以帮我吗?

最佳答案

你把事情搞混了。

首先建立一个路径。然后使用它。命名空间管理器只对第二步很重要。

string au = "Tommy";
string path = String.Format("//bk:bookstore/book[@author = '{0}']/title", au);

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("bk", "http://www.test.com/");

XmlNodeList elements0 = xml.SelectNodes(path, nsmgr);

注意路径中的单引号。

另请注意,当输入字符串( au )中有单引号时,这将中断。这在最好的情况下可能是随机运行时错误的来源,在最坏的情况下可能是 XPath 注入(inject)的攻击向量。这意味着您必须处理这种情况。

解决此问题的选项有:
  • 明确禁止输入中的单引号并另外使用 au.Replace("'", "")在构建路径时。这可能不适合人名。
  • 构建一个允许单引号的更复杂的路径。这不是微不足道的,因为 XPath 没有字符串转义机制。
  • Use a more advanced way of defining an XPath query.

  • 对于选项 2,假设作者 "O'Reilly" ,路径需要如下所示:

    //bk:bookstore/book[@author = concat('O', "'", 'Reilly')]/title

    因为表达式 concat('O', "'", 'Reilly')产生字符串 "O'Reilly"在 XPath 引擎中。使用 concat()这种方式是将定界引号嵌入 XPath 字符串的唯一方法。

    该函数产生这样的表达式:

    public static string XPathEscape(string input)
    {
    if (String.IsNullOrEmpty(input)) return "''";

    if (input.Contains("'"))
    {
    string[] parts = input.Split("'".ToCharArray());
    return String.Format("concat('{0}')", String.Join(@"', ""'"", '", parts));
    }
    else
    {
    return String.Format("'{0}'", input);
    }
    }

    使用方法如下:

    string au = "O'Reilly";
    string path = String.Format("//bk:bookstore/book[@author = {0}]/title", XPathEscape(au));

    请注意,这次路径中没有单引号。

    关于xml - Xpath使用属性作为xml文件中的变量,其中有一个命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744805/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com