C# 对具有xmlns属性的节点使用XmlDocument()?
我试图使用XmlDocument()逐节点读取XML文件,并输出每个元素 经过多次尝试和错误,我确定在我的节点上具有xmlns属性会导致SelectNodes()调用不会返回任何节点。不知道为什么 既然我不能更改输出格式,也不能访问实际的名称空间,那么我有什么办法来解决这个问题呢 另外,我有一些元素有子节点。在循环遍历XML文件时如何访问这些文件?也就是说,我需要解密CipherValue元素,但不确定如何访问该节点 样本如下:C# 对具有xmlns属性的节点使用XmlDocument()?,c#,xml,xml-namespaces,C#,Xml,Xml Namespaces,我试图使用XmlDocument()逐节点读取XML文件,并输出每个元素 经过多次尝试和错误,我确定在我的节点上具有xmlns属性会导致SelectNodes()调用不会返回任何节点。不知道为什么 既然我不能更改输出格式,也不能访问实际的名称空间,那么我有什么办法来解决这个问题呢 另外,我有一些元素有子节点。在循环遍历XML文件时如何访问这些文件?也就是说,我需要解密CipherValue元素,但不确定如何访问该节点 样本如下: doc.Load(@"test.xml"); XmlNodeLis
doc.Load(@"test.xml");
XmlNodeList logEntryNodeList = doc.SelectNodes("/Logs/LogEntry");
Console.WriteLine("Nodes = {0}", logEntryNodeList.Count);
foreach (XmlNode xn in logEntryNodeList)
{
string dateTime = xn["DateTime"].InnerText;
string sequence = xn["Sequence"].InnerText;
string appId = xn["AppID"].InnerText;
Console.WriteLine("{0} {1} {2}", dateTime, sequence, appId);
}
示例XML如下所示:
<Logs>
<LogEntry Version="1.5" PackageVersion="10.10.0.10" xmlns="http://private.com">
<DateTime>2013-02-04T14:05:42.912349-06:00</DateTime>
<Sequence>5058</Sequence>
<AppID>TEST123</AppID>
<StatusDesc>
<EncryptedData>
<CipherData xmlns="http://www.w3.org/2001/04/xmlenc#">
<CipherValue>---ENCRYPTED DATA BASE64---</CipherValue>
</CipherData>
</EncryptedData>
</StatusDesc>
<Severity>Detail</Severity>
</LogEntry>
<LogEntry Version="1.5" PackageVersion="10.10.0.10" xmlns="http://private.com">
<DateTime>2013-02-04T14:05:42.912350-06:00</DateTime>
<Sequence>5059</Sequence>
<AppID>TEST123</AppID>
<StatusDesc>
<EncryptedData>
<CipherData xmlns="http://www.w3.org/2001/04/xmlenc#">
<CipherValue>---ENCRYPTED DATA BASE64---</CipherValue>
</CipherData>
</EncryptedData>
</StatusDesc>
<Severity>Detail</Severity>
</LogEntry>
</Logs>
2013-02-04T14:05:42.912349-06:00
5058
测试123
---加密的数据库64---
细节
2013-02-04T14:05:42.912350-06:00
5059
测试123
---加密的数据库64---
细节
经过多次尝试和错误,我确定在我的节点上具有xmlns属性会导致SelectNodes()调用不会返回任何节点。不知道为什么
xmlns
属性有效地更改了元素中的默认名称空间,包括该元素本身。因此,LogEntry
元素的名称空间是”http://private.com“
。您需要在XPath查询中适当地包括这一点,可能是通过一个
(如果可以改用LINQtoXML,那么使用名称空间就容易多了。)可以使用LINQtoXML(正如Jon所说)。下面是根据名称空间解析xml文件的代码。结果是匿名对象的强类型序列(即Date属性的类型为DateTime,序列为整数,AppID为字符串):
我将尝试--如何处理子节点?我已更改为.NET 4.0 Full,但在.SELECTError 23的System.Collections.Generic.IEnumerable中出现此错误。该错误不包含“Select”的定义,并且找不到扩展方法“Select”接受类型为“System.Collections.Generic.IEnumerable”的第一个参数(您是否缺少using指令或程序集引用?@user500741请确保您制作了上述代码的精确副本。它适用于您的示例xml。另外,请确保您的源代码文件顶部有
using System.Linq;
谢谢--我缺少System.Linq
XDocument xdoc = XDocument.Load("test.xml");
XNamespace ns = "http://private.com";
var entries = xdoc.Descendants("Logs")
.Elements(ns + "LogEntry")
.Select(e => new {
Date = (DateTime)e.Element(ns + "DateTime"),
Sequence = (int)e.Element(ns + "Sequence"),
AppID = (string)e.Element(ns + "AppID")
}).ToList();
Console.WriteLine("Entries count = {0}", entries.Count);
foreach (var entry in entries)
{
Console.WriteLine("{0}\t{1} {2}",
entry.Date, entry.Sequence, entry.AppID);
}