【发布时间】:2015-03-13 15:40:48
【问题描述】:
我正在做一个项目,我接受一个 XML 文件并且需要遍历 XML 并输出特定节点的文本值,我正在努力寻找最好的方法来做到这一点。
我正在使用以下代码,它适用于我定义的单个 XPath 节点,它工作正常,但我需要提取其他节点及其相关文本。任何指向正确方向的指针将不胜感激。我一直在阅读来自 Microsoft 的 XPathNavigator、XPathNodeIterator、XMLReader 文档并使用他们的示例,但似乎没有一个适合这个特定的用例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.XPath;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
XPathDocument document = new XPathDocument("Security_Policy.xml");
XPathNavigator navigator = document.CreateNavigator();
XPathNodeIterator nodes = navigator.Select("//Rule_Number");
while (nodes.MoveNext())
{
Console.WriteLine(nodes.Current.Value);
}
}
}
}
这是我正在使用的相关 XML 块。
<?xml version="1.0" encoding="utf-8"?>
<rule>
<Name></Name>
<Class_Name>security_rule</Class_Name>
<Rule_UUID>{9BA1463A-00D0-4819-88B6-650407733A96}</Rule_UUID>
<Rule_Number>1</Rule_Number>
<action>
<action>
<Name>accept</Name>
<Class_Name>accept_action</Class_Name>
<action><![CDATA[]]></action>
<identity_settings>
<Name></Name>
<Class_Name>identity_action_settings</Class_Name>
<allow_ad_query>true</allow_ad_query>
<allow_captive_portal>true</allow_captive_portal>
<allow_identity_agent>true</allow_identity_agent>
<allowed_sources><![CDATA[All Sources]]></allowed_sources>
<redirect_to_captive_portal>false</redirect_to_captive_portal>
<require_packet_tagging>false</require_packet_tagging>
<type><![CDATA[identity_action_settings]]></type>
</identity_settings>
<macro><![CDATA[RECORD_CONN]]></macro>
<type><![CDATA[accept]]></type>
</action>
</action>
<comments><![CDATA[]]></comments>
<disabled>false</disabled>
<dst>
<Name></Name>
<Class_Name>rule_destination</Class_Name>
<members>
<reference>
<Name></Name>
<Table>network_objects</Table>
</reference>
<reference>
<Name></Name>
<Table>network_objects</Table>
</reference>
</members>
<compound></compound>
<op><![CDATA[]]></op>
</dst>
<global_location><![CDATA[middle]]></global_location>
<install>
<Name></Name>
<Class_Name>rule_install</Class_Name>
<members>
<reference>
<Name>Any</Name>
<Table>globals</Table>
</reference>
</members>
<compound></compound>
</install>
<name><![CDATA[]]></name>
<services>
<Name></Name>
<Class_Name>rule_services</Class_Name>
<members>
<reference>
<Name>Any</Name>
<Table>globals</Table>
</reference>
</members>
<compound></compound>
<op><![CDATA[]]></op>
</services>
<src>
<Name></Name>
<Class_Name>rule_source</Class_Name>
<members>
<reference>
<Name></Name>
<Table>network_objects</Table>
</reference>
<reference>
<Name></Name>
<Table>network_objects</Table>
</reference>
</members>
<compound></compound>
<op><![CDATA[]]></op>
</src>
<through>
<Name></Name>
<Class_Name>rule_vpn</Class_Name>
<members>
<reference>
<Name>Any</Name>
<Table>globals</Table>
</reference>
</members>
<compound></compound>
</through>
<time>
<time>
<Name>Any</Name>
<Table>globals</Table>
</time>
</time>
<track>
<track>
<Name>Log</Name>
<Table>tracks</Table>
</track>
</track>
</rule>
【问题讨论】:
-
Linq to XML可能是最容易使用的。你能具体告诉我们你想要什么输出吗?您当前的代码显示了哪些有效,而不是哪些无效。