【问题标题】:How to search entire XML file for keyword?如何在整个 XML 文件中搜索关键字?
【发布时间】:2022-02-26 17:02:15
【问题描述】:

我正在学习 C#,我想做的一件事是读入一个 XML 文件并搜索它。

我找到了一些示例,我可以在其中搜索特定节点(例如,如果它是名称或 ISBN)以查找特定关键字。

我想做的是搜索整个 XML 文件,以找到关键字的所有可能匹配项。

我知道 LIST 允许“包含”来查找关键字,是否有类似的功能用于搜索 XML 文件?

我使用的是安装 Visual Studio 时包含的通用 books.xml 文件。

【问题讨论】:

  • 到目前为止你尝试过什么?你能告诉我们你的代码阅读和搜索xml吗?
  • 除了您希望您的关键字是什么?一个元素的值,一个属性的值,等等...... ??
  • 也许你应该把它当作一个文本文件,然后做一个简单的搜索。

标签: c# xml linq


【解决方案1】:

如果您只想搜索关键字出现在叶子节点的文本中,请尝试以下操作 (使用此示例books.xml):

string keyword = "com";
var doc = XDocument.Load("books.xml");

var query = doc.Descendants()
    .Where(x => !x.HasElements &&
                x.Value.IndexOf(keyword, StringComparison.InvariantCultureIgnoreCase) >= 0);
foreach (var element in query)
    Console.WriteLine(element);

输出:

<genre>Computer</genre>
<description>A former architect battles corporate zombies,
      an evil sorceress, and her own childhood to become queen
      of the world.</description>
<genre>Computer</genre>
<title>MSXML3: A Comprehensive Guide</title>
<genre>Computer</genre>
<title>Visual Studio 7: A Comprehensive Guide</title>
<genre>Computer</genre>
<description>Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are
      integrated into a comprehensive development
      environment.</description>

【讨论】:

    【解决方案2】:

    如果您正在寻找一个您已经知道的关键字,您可以将 XML 解析为简单的文本文件并使用 StreamReader 进行解析。但是,如果您正在寻找 XML 中的元素,您可以使用 XmlTextReader(),请考虑以下示例:

    using (XmlTextReader reader = new XmlTextReader(xmlPath))
    {
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            { 
                //do your code here
            }
        }
    }
    

    希望对您有所帮助。 :)

    【讨论】:

      【解决方案3】:

      例如,您可以使用LINQ TO XML。此示例在元素和属性中搜索关键字 - 在它们的名称和值中。

      private static IEnumerable<XElement> FindElements(string filename, string name)
      {
          XElement x = XElement.Load(filename);
          return x.Descendants()
                  .Where(e => e.Name.ToString().Equals(name) ||
                              e.Value.Equals(name) ||
                              e.Attributes().Any(a => a.Name.ToString().Equals(name) || 
                                                      a.Value.Equals(name)));
      }
      

      并使用它:

      string s = "search value";
      foreach (XElement x in FindElements("In.xml", s))
          Console.WriteLine(x.ToString());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-03
        • 2021-03-13
        • 2016-11-06
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 2015-07-01
        • 1970-01-01
        相关资源
        最近更新 更多