【问题标题】:Pull specific xml tag in a xml file using XmlDocument使用 XmlDocument 在 xml 文件中拉取特定的 xml 标记
【发布时间】:2016-04-05 10:09:00
【问题描述】:

我有一个 xml 文件,我想做的是解析完整的文件并搜索特定的 xml 标记(在我的情况下,我正在搜索 queryString),当遇到标记时拉出内部对应的文字。我正在使用XmlDocumentXmlDocument.SelectNodes("/stringList")

执行此操作时,将返回 null 值。我错过了什么吗?

XmlDocument xml = new XmlDocument();
Jrxml.Load(file_path);
XmlNodeList xml_nodes = xml.SelectNodes("/stringList");
foreach (XmlNode jr_node in xml_nodes)
{
    XmlNode query_node = jr_node.SelectSingleNode("queryString");
}

执行时它不会进入 for 循环,因为 xml_nodes 的值是 null

Xml 文件如下所示。

<stringList>
    <property1/>
    <property2/>
       <style>
         <queryString>
         </queryString>
       </style>
    <queryString>
    </queryString>
</stringList>

【问题讨论】:

  • Xml 长什么样子?
  • xml 文档是否包含命名空间?
  • 是的,它确实包含命名空间@KeithHall
  • @HariPrasad 添加了 xml 的外观,尽管 xmlnode queryString 不固定到我在视图中提到的那个。

标签: c# xml xmldocument xmlnode xmlnodelist


【解决方案1】:

如果您只搜索“queryString”标签,我建议您使用 XmlDocument 方法 GetElementsByTagName。考虑:

using System;
using System.Xml;
namespace TestCon
{
    class Program
    {
        private static XmlDocument TestDoc;
        public static void Main(string[] args)
        {
            TestDoc = new XmlDocument();
            TestDoc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
                    "<stringList>\n"+
                    "<property1/>\n"+"<property2/>\n"+
    "<style>\n"+"<queryString>Who's on fist."+"</queryString>\n"+
    "</style>\n"+"<queryString>Who's on second."+"</queryString>\n"+
    "</stringList>");
            XmlNodeList elemList = TestDoc.GetElementsByTagName("queryString");
            foreach (XmlNode foundNode in elemList) 
            {
                Console.WriteLine(foundNode.InnerText);
            }
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}

您将获得您正在搜索的两个节点:

Who's on first.
Who's on second.
Press any key to continue . . .

【讨论】:

  • 解决了...我错过了将 xml 文件的内容移动到字符串。
【解决方案2】:

我更喜欢 System.Xml.Linq 中的 XML 类/功能:

XDocument doc = XDocument.Parse(xmlString);

foreach (XElement queryString in doc.Descendants("queryString"))
{
    // do something with queryString.Value  ...
}

【讨论】:

    【解决方案3】:

    你可以像这样使用xml linq

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string xml =
                    "<root>" +
                    "<stringList>" +
                        "<property1/>" +
                        "<property2/>" +
                           "<style>" +
                             "<queryString>" +
                             "</queryString>" +
                           "</style>" +
                        "<queryString>" +
                        "</queryString>" +
                    "</stringList>" +
                    "</root>";
                XDocument doc = XDocument.Parse(xml);
    
                var stringList = doc.Descendants("stringList").Select(x => new
                {
                    property1 = x.Element("property1"),
                    property2 = x.Element("property2"),
                    style = x.Element("style"),
                    queryString = x.Element("queryString")
                });
    
            }
        }
    }
    

    【讨论】:

    • 这里预定义了元素,而我的要求是所需的标签不需要遵循相同的结构。
    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2013-08-28
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多