在某些条件下读取xml文件

时间:2014-09-30 07:16:33

标签: c# xml

我想使用xml文件,如下所示

<?xml version="1.0" encoding="utf-8" ?>
<pages>
    <page name="Default.aspx">
        <method name="Login_click">
            <message code="0" description="this is a test description">
                <client code="0000000000" description="this is a description for clent 0000000000" />
            </message>
        </method>
    </page>
</pages>

现在我想创建一个如下所示的函数

 public static string GetAppMessage(string pageName, string methodName, string clientCode, string code)
 {
        var xmlFile = HttpContext.Current.Server.MapPath("~/App_Data/Theme.xml");
        var doc = new XmlDocument();
        doc.Load(xmlFile);
        if (string.IsNullOrEmpty(clientCode))
        {
           //go to node who page name to pageName
           //and read the vlue   
        }
        else
        {
            //read for a particular client code
        }
 }

我该怎么办呢。

编辑1

我是否需要循环遍历每个节点,或者我是否可以直接访问特定节点并找到死亡节点。

如下所示

foreach (XmlNode chldNode in doc.ChildNodes)
{

   ....

3 个答案:

答案 0 :(得分:0)

您可以使用XDocument和LINQ to xml:

代替XmlDocument
var xmlFile = HttpContext.Current.Server.MapPath("~/App_Data/Theme.xml");
XDocument xmlDoc = XDocument.Load(xmlFile);
var xmlPage = (from page in xmlDoc.Descendants()
              where page.Name.LocalName == "page"
                    && page.Attribute("name").Value == pageName
              select page).FirstOrDefault();
if (xmlPage != null)
{
    //do what you need
}

答案 1 :(得分:0)

当您使用XmlDocument并且您知道XML文件的外观(我的意思是您知道信息所在的节点的名称)时,您可以执行以下操作:

XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlElement root = doc["NameOfRootNode"];

if (root != null)
{
     //For nodes you just need to bypass to get to another subnode:
     XmlNode node = root.SelectSingleNode("nameOfAnotherNode");  

     //For nodes you actually want to do something with, like read text, attribute etc.
     if (node != null && node.SelectSingleNode("nameOfOneMoreNode") != null)
     {
          var xmlElement = node["nameOfOneMoreNode"];
          if (xmlElement != null) 
          {
               //Read from the xmlElement you selected and do something with it...
          }
     }

     //...
}

使用SelectSingleNode或SelectNodes,您可以操纵特定的已知节点,并可以读取InnerText或属性。

答案 2 :(得分:0)

您可以使用XPath通过<page>属性获取name元素,例如:

string xpath = "//page[@name='{0}']";
XmlNode page = doc.SelectSingleNode(string.Format(xpath, pageName));
//and read the vlue

基本上,在XPath之上查找具有<page>属性等于name参数的pageName元素。