【发布时间】:2015-12-24 03:45:21
【问题描述】:
我需要从 XML 节点获取值,比如 XML 下面的示例。
<Names>
<Name>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Name>
<Name>
<FirstName>James</FirstName>
<LastName>White</LastName>
</Name>
</Names>
我使用的代码如下。
XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString); // suppose that myXmlString contains "<Names>... </Names>"
XmlNodeList xnList = xml.SelectNodes("/Names/Name");
foreach (XmlNode xn in xnList)
{
string firstName = xn["FirstName"].InnerText;
string lastName = xn["LastName"].InnerText;
Console.WriteLine("Name: {0} {1}", firstName, lastName);
}
这在单独的解决方案中运行良好。但是当我在我的一个应用程序中使用相同的代码作为一部分时,它不会检索值。 基本上,我的应用程序调用 WCF web servcie,retun 中的 web 服务发送字符串。我正在将该字符串转换为 XML 文档,并且当我将该文档作为 XML 文件写入服务器时,我能够看到整个 XML。但是当我尝试遍历并获取相同的节点时,它是不成功的。 我没有收到任何错误,但控件没有进入 foreach() 循环。这意味着 xnList.Count 为 0(零)。
过去 3 天我一直在努力解决这个问题。 谁能帮我解决这个问题。
提前谢谢大家!!!
【问题讨论】:
-
XmlDocument是一种在 C# 中使用 XML 的老式方式。尽可能使用XDocument。 -
你试过调试吗?在第 3 行下一个断点,
xml.OuterXml的值是多少?如果它为空,那么您获取的字符串不正确。如果不是,请尝试将xml.SelectNodes("/Names/Name")添加到 Watches。如果它不为空,那么它可以工作。如果它是空的,那么尝试另一个 XPath,比如*并再次查看 XML - 肯定有问题。 -
XML 声明中必须有命名空间。这很可能是问题的原因。如果这样做,则需要将命名空间添加到 xpath 查询并使用 xml 命名空间管理器。
-
我的猜测是您从服务器返回的 xml 与您的示例 xml 不同,可能包含命名空间等额外信息
-
由于您的代码 sn-p 和 xml 在我的机器上工作,我将与其他人一起克服您输入的 xml 语法有问题。如果您仍然卡住,如果您希望将其用作参考,我可以在答案中发布我的内容。
标签: c# xml-parsing