【问题标题】:Check xml element value C#检查xml元素值C#
【发布时间】:2016-12-22 17:42:07
【问题描述】:

我有一个 xml 文件,例如:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Session TimeStamp="2016-12-21T17:01:01.8642453+02:00">
    <Message>
      <Content>test1</Content>
      <ID>1</ID>
      <Timestamp>12/21/2016 17:01:01</Timestamp>
      <EventType>Debug</EventType>
      <Priority>High</Priority>
    </Message>
    <Message>
      <Content>test2</Content>
      <ID>2</ID>
      <Timestamp>12/21/2016 17:01:01</Timestamp>
      <EventType>Exception</EventType>
      <Priority>Low</Priority>
    </Message>
    <Message>
      <Content>test3</Content>
      <ID>3</ID>
      <Timestamp>12/21/2016 17:01:01</Timestamp>
      <EventType>Info</EventType>
      <Priority>Medium</Priority>
    </Message>
    <Message>
      <Content>test4</Content>
      <ID>4</ID>
      <Timestamp>12/21/2016 17:01:01</Timestamp>
      <EventType>Warn</EventType>
      <Priority>None</Priority>
    </Message>
  </Session>
</Root>

我想检查我尝试使用此方法的每条消息中元素 Content 的值:

Assert.IsTrue(xDocument.Root.Elements("Session").Last().Elements("Message").First().Element("Content").Value.Contains("test1"));

异常:System.InvalidOperationException:序列不包含任何元素

方法失败,找不到元素值,我该如何使用xdocument?

【问题讨论】:

  • 我建议你把这个长语句拆分成更短的语句,然后在调试器中逐个执行。这样你就可以看到哪个语句失败了。并且希望查看变量会给你一些关于它失败原因的提示。
  • 您的代码在我尝试复制它时有效。您如何将文本解析为 xDocument?你在使用 XDocument.Parse 吗?

标签: c# xml


【解决方案1】:

既然你这么说你在找这个吗

我想检查每条消息中元素 Content 的值

xDocument.Root.Elements("Session")
              .Elements("Message")
              .Elements("Content")
              .Select(x => x.Value.Contains("test1"));

它将返回哪个节点包含test1,因此结果将是true,false,false,false

编辑

根据您的评论“我只想验证消息 1 内容是否包含字符串“test1”

    xDocument.Root.Elements("Session")
              .Elements("Message")
              .Elements("Content")
              .FirstOrDefault().Value.Contains("test1");

【讨论】:

  • 我只想验证消息 1 内容是否包含字符串“test1”
【解决方案2】:
XmlDocument advDoc=new XmlDocument();
advDoc.Load("test.xml");
XmlNodeList _ngroups = advDoc.GetElementsByTagName("Content");
foreach(XmlNode nd in _ngroups)
{
  if(nd.InnerText.ToString()=="test1")
   Console.WriteLine("true");
}

【讨论】:

  • 像这样的纯代码答案不是很清楚。请解释你的代码是做什么的。
【解决方案3】:

我只想验证消息 1 内容是否包含字符串“test1”

string pathToXmlFile = ""; // point to your xml file ... 
using (StreamReader reader = File.OpenText(pathToXmlFile))
{
    XDocument doc = XDocument.Load(reader); // load into XDocument
    XElement idElement = doc.Root.Element("Session").Elements("Message").Elements("ID").First( item => item.Value == "1"); // since you need the message id = 1
    string content = idElement.Parent.Element("Content").Value; // get the parent of this message id which is message element then navigate to its content element.
}

希望这会有所帮助..

【讨论】:

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