【问题标题】:I need to get some values from XML我需要从 XML 中获取一些值
【发布时间】:2013-08-13 22:22:45
【问题描述】:

例如,我需要得到: 新闻名称和新闻日期:

<info>
<news>
<news name="Test 1" date="08.13.2013"/>
<news name="Test 2" date="08.09.2013"/>
</news>
</info>

使用 C#,在控制台中显示这个..

我尝试了几个代码,这些代码是在互联网上找到的。 但没有人为我服务!

编辑¹: 我试过以下代码:

XmlDocument Doc = new XmlDocument();
Doc.Load(Server.MapPath("Content/Doc.xml"));
XmlNodeList itemList = Doc.DocumentElement.SelectNodes("news");
foreach (XmlNode currNode in itemList)
{
  string name = string.Empty;  <!-- here I make a new string and call it "date"-->
  XmlNode item = currNode.SelectSingleNode("news");
  name = item.Attributes["name"].Value.ToString();
  Console.WriteLine("Test Name: "+name+"");
}

和:

XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString);

XmlNodeList xnList = xml.SelectNodes("/news/news");
foreach (XmlNode xn in xnList)
{
  string name = xn["name"].InnerText;
  string date = xn["date"].InnerText;
  Console.WriteLine("Test: {0} {1}", name, date);
}

但它不起作用,什么也没有出现。或程序自动关闭。

已解决!谢谢大家!

我使用这个代码:

static void Main(string[] args)
        {
            XElement rootElement = XElement.Load(@"http://mywebsite.com/test.xml");

            Program test = new Program();
            Console.WriteLine(test.GetOutline(0, rootElement));  
        }

        private string GetOutline(int indentLevel, XElement element)
        {
            StringBuilder result = new StringBuilder();

            if (element.Attribute("name") != null)
            {
                result = result.AppendLine(new string(' ', indentLevel * 2) + element.Attribute("name").Value);
            }

            foreach (XElement childElement in element.Elements())
            {
                result.Append(GetOutline(indentLevel + 1, childElement));
            }

            return result.ToString();
        }

结果: 测试 1 测试 2

【问题讨论】:

  • 请不要只求我们为您解决问题。向我们展示如何尝试自己解决问题,然后向我们确切地展示结果是什么,并告诉我们您为什么觉得它不起作用。请参阅“What Have You Tried?”了解您真正需要阅读的优秀文章。
  • 你试过的代码是什么?可以发个样品吗?
  • 在上面添加了我的尝试。
  • 我会试试 Bartos 说的,谢谢。

标签: c# xml get


【解决方案1】:

我喜欢使用 Linq to XML 来处理这类事情。

我在 LinqPad 中测试了这个 sn-p...应该让你知道如何做到这一点。

var xml = @"<info>
                <news>
                    <news name='Test 1' date='08.13.2013'/>
                    <news name='Test 2' date='08.09.2013'/>
                </news>
            </info>";

var doc = XElement.Parse(xml);

var list = from x in doc.DescendantsAndSelf("news")
            where !string.IsNullOrEmpty((string)x.Attribute("name"))
            select new {name = (string)x.Attribute("name"), date = (DateTime)x.Attribute("date")};
list.Dump();

【讨论】:

    【解决方案2】:

    Linq to Xml 可能是更好的选择,因为获取数据更简单直接,

    例如,根据您提供的 xml 示例获取数据的一种方法可能是这样的:

    XElement data = XElement.Load(@"C:\Test.xml");
    
    var newsResults = data.Element("news")
                   .Descendants("news")
                   .Select(x => new
                   {
                       Name = (string)x.Attribute("name"),
                       Date = (DateTime)x.Attribute("date")
                   });
    
    foreach (var news in newsResults)
    {
        Console.WriteLine("News: {0}, Date: {1}", news.Name, news.Date);
    }
    

    【讨论】:

      【解决方案3】:

      让您的新闻容器包含新闻元素会稍微复杂一些。但是基本的 xml 操作看起来像......

      XDocument xdoc = XDocument.Load(Server.MapPath("Content/Doc.xml"));
      
      var newsParent = xdoc.Descendants("news").First();  // gets the parent news item
      var news = newsParent.Descendants("news")
          .Select(x => new {Name = x.Attribute("name"), Date = x.Attribute("date")});
      foreach (var element in news)
      {
          Console.WriteLine(element.Name +" "+ element.Date);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多