【问题标题】:Returning the first possible node's inner text in a XML file返回 XML 文件中第一个可能的节点的内部文本
【发布时间】:2012-07-11 14:36:25
【问题描述】:

我编写了一个专门搜索给定完整xpath 并返回内部文本的方法。但是由于我正在处理的文件都有唯一的节点名称,我想以某种方式做到这一点,只传递节点名称就可以了。

我的代码现在的样子:

public string FileInfo(string info)
{
    switch (info)
    {
        //FileInfo
        case "fileCreator":
            fileCreator = ztr.SelectSingleNode("//Document/FileInfo/Creator").InnerText;
            return fileCreator;
        case "fileName":
            fileName = ztr.SelectSingleNode("//Document/FileInfo/Name").InnerText;
            return fileName;
      //And so on with lots of other cases!!!

我怎样才能让它搜索第一次出现的info 字符串,它是一个 xml 节点,所以我不必愚蠢并编写所有这些 switch 语句......

更新

请注意不是我想要的所有东西都位于FileInfo节点...我想要搜索我传递给它的节点的方法!或者更好地说我想将节点本身的名称传递给这个方法并获取它的值。抱歉,如果我在此编辑之前感到困惑!

xml 文件中的更多示例:

/Document/RuntimeInfo/Operator

所以我想将“运算符”传递到我的方法中并获得它的值!应该由方法来发现正确的路径。 pats 是独一无二的,因此实施此方法不会是一个坏主意。

【问题讨论】:

  • 更新说明:你能举一个“文件信息节点外”的例子吗?

标签: c# xml linq xpath


【解决方案1】:

这不就行了吗?

var value = ztr.SelectSingleNode(string.Format("//{0}", info).InnerText;

【讨论】:

    【解决方案2】:
    return ztr.SelectSingleNode(string.Format("//Document/FileInfo/{0}", 
                                info.Replace("file", "").InnerText;
    

    编辑

    如果搜索到的节点始终处于同一嵌套级别,您可能会使用通配符

    return ztr.SelectSingleNode(string.Format("//Document/*/{0}", 
                                    info).InnerText;
    

    顺便说一句,在您的示例中,您通过fileCreator 来查找Creator 节点。错别字?

    【讨论】:

    • hmmm 这不起作用,我需要检索的一些东西位于其他父节点中,Document/FileInfor 只是其中一个节点。
    • @Sean87,是的,我看到了你的更新,你能回答我的评论吗?
    • 有没有办法在不关心嵌套级别的情况下完成这项工作?!
    【解决方案3】:

    试试,

    return ztr.SelectSingleNode(string.Format("//{0}[contains(name(..),'Info')]", info));
    

    如果info 是Operator,它将返回第一个Operator 节点,该节点的父节点名称中包含Info。

    【讨论】:

      【解决方案4】:

      使用这个 XPath:

      //Document/FileInfo/[0]
      

      你的代码可以是这样的:

      public string FileInfo(string info)
      {
          return ztr.SelectSingleNode("//Document/FileInfo/[0]").InnerText;
      }
      

      详细了解 xpath here。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        • 2016-03-08
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多