第一篇文章。我希望它符合提问的规则。
我对xml文档(它的API返回Xml)有点麻烦。现在它使用了大量互联网(基于http)的安全措施,我已经完成了工作,现在我可以返回未嵌套的顶层节点。
但是有一些节点嵌套在这些节点之下,我需要返回其中一些值。
我已经开始使用XMLDocument来执行此操作,我对使用XPath不感兴趣。
我还应该注意到我正在使用.Net 4.5环境。
示例XML
<?xml version="1.0" encoding="utf-8"?>
<results>
<Info xmlns="http://xmlns.namespace">
<title>This Title</title>
<ref>
<SetId>317</SetId>
</ref>
<source>
<name>file.xxx</name>
<type>thisType</type>
<hash>cc7b99599c1bebfc4b8f12e47aba3f76</hash>
<pers>65.97602</pers>
<time>02:20:02.8527777</time>
</source>
....... Continuation which is same as above
好的以上是从API返回的Xml,现在,我可以返回标题节点没问题。我还想返回的是Element中的任何节点值,例如pers节点值。但我只想返回一个(因为现有的xml中有很多内容已经向下)
请注意,Info节点中有一个xmlns,可能不允许我返回值。
所以这是我的代码
using (var response = (HttpWebResponse) request.GetResponse())
{
//Get the response stream
using (Stream stream = response.GetResponseStream())
{
if (stream != null)
{
var xDoc = new XmlDocument();
var nsm = new XmlNamespaceManager(xDoc.NameTable);
nsm.AddNamespace("ns", XmlNamespace);
//Read the response stream
using (XmlReader xmlReader = XmlReader.Create(stream))
{
// This is straight forward, we just need to read the XML document and return the bits we need.
xDoc.Load(xmlReader);
XmlElement root = xDoc.DocumentElement;
var cNodes = root.SelectNodes("/results/ns:Info", nsm);
//Create a new instance of Info so that we can store any data found in the Info Properties.
var info = new Info();
// Now we have a collection of Info objects
foreach (XmlNode node in cNodes)
{
// Do some parsing or other relevant filtering here
var title = node["title"];
if (title != null)
{
info.Title = title.InnerText;
_logger.Info("This is the title returned ############# {0}", info.Title);
}
//This is the bit that is killing me as i can't return the any values in the of the sub nodes
XmlNodeList sourceNodes = node.SelectNodes("source");
foreach (XmlNode sn in sourceNodes)
{
XmlNode source = sn.SelectSingleNode("source");
{
var pers = root["pers"];
if (pers != null) info.pers = pers.InnerText;
_logger.Info("############FPS = {0}", info.pers);
}
}
}
}
提前感谢您提供任何帮助
答案 0 :(得分:0)
所以我终于明白了。
以下是获取子节点的代码。基本上我没有使用我的命名空间标识符或我的命名空间来返回“源”节点内的子节点。
对于这种情况下的其他人,
当你声明你的名字空间时,它就是它的一部分,一个命名空间标识符,你想要它在我的情况下,我选择“ns”,然后是XML文件中的实际命名空间,前缀为xmlns和将包含类似的内容:“http://xmlns.mynamespace”。
因此,当搜索顶层内的子节点时,您需要为要获取的子节点的主节点声明这些命名空间。
// get the <source> subnode using the namespace to returns all <source> values
var source = node.SelectSingleNode("ns:source", nsm);
if (source != null)
{
info.SourceType = source["type"].InnerText;
info.Pers = source["pers"].InnerText;
_logger.Info("This SourceNode is {0}", info.SourceType);
_logger.Info("This PersNode is {0}", info.FramesPerSecond);
}
我希望这有助于其他人像我一样追逐他们的尾巴。
由于