Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对具有xmlns属性的节点使用XmlDocument()?_C#_Xml_Xml Namespaces - Fatal编程技术网

C# 对具有xmlns属性的节点使用XmlDocument()?

C# 对具有xmlns属性的节点使用XmlDocument()?,c#,xml,xml-namespaces,C#,Xml,Xml Namespaces,我试图使用XmlDocument()逐节点读取XML文件,并输出每个元素 经过多次尝试和错误,我确定在我的节点上具有xmlns属性会导致SelectNodes()调用不会返回任何节点。不知道为什么 既然我不能更改输出格式,也不能访问实际的名称空间,那么我有什么办法来解决这个问题呢 另外,我有一些元素有子节点。在循环遍历XML文件时如何访问这些文件?也就是说,我需要解密CipherValue元素,但不确定如何访问该节点 样本如下: doc.Load(@"test.xml"); XmlNodeLis

我试图使用XmlDocument()逐节点读取XML文件,并输出每个元素

经过多次尝试和错误,我确定在我的节点上具有xmlns属性会导致SelectNodes()调用不会返回任何节点。不知道为什么

既然我不能更改输出格式,也不能访问实际的名称空间,那么我有什么办法来解决这个问题呢

另外,我有一些元素有子节点。在循环遍历XML文件时如何访问这些文件?也就是说,我需要解密CipherValue元素,但不确定如何访问该节点

样本如下:

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);
}