如何通过索引获取xpath以动态更新XML文件C# [英] How to get xpath with indexing to update XML file dynamically C#

查看:107
本文介绍了如何通过索引获取xpath以动态更新XML文件C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

<?xml version =1.0encoding =UTF-8?> 
< breakfast_menu>
< food>
< name> Belgian Waffles
< price> $ 5.95
< description>
两个着名的比利时华夫饼干,含有大量真正的枫糖浆

< calories> 650

< food>
< name> Strawberry Belgian Waffles
< price> $ 7.95
< description>
轻薄比利时华夫饼配草莓和生奶油

< calories> 900

< food>
< name> Berry-Berry比利时华夫饼干
< price> $ 8.95
< description>
比利时华夫饼配上各种新鲜浆果和鲜奶油

< calories> 900





我的输出

比利时华夫饼我的xPath ==breakfast_menu / food / name
草莓比利时华夫饼我的xPath ==breakfast_menu / food / name
Berry-Berry比利时华夫饼我的xPath ==breakfast_menu / food / name





但我希望输出像

 Belgian Waffles my xPath == breakfast_menu / food [1] / name
Strawberry Belgian Waffles my xPath ==breakfast_menu / food [2] / name
Berry-Berry比利时华夫饼我的xPath ==breakfast_menu / food [3] / name





我尝试过:



 using(XmlReader reader = XmlReader.Create(pathMain))
{
XmlNode nodeTemp;
var elements = new Stack< string>();
var pathX = string.Empty;
var pathXTemp = string.Empty;
string prevNodeType = string.Empty;
string currNodeType = string.Empty;
while(reader.Read())
{

string dg = string.Empty;

if(!reader.IsEmptyElement == true)
{
currNodeType = reader.Name.ToString();
if((reader.NodeType.ToString()==EndElement)||(prevNodeType!= currNodeType))
{
indx = 1;
}
switch(reader.NodeType)
{
case XmlNodeType.Element:
elements.Push(reader.LocalName);

addtoStackPanel(reader.Name,reader.Value,pathMain,pathX,0);
休息;
case XmlNodeType.Text:
if((reader.Value!=)&&(reader.Name!=style))
{


pathX = string.Join(/,elements.Reverse());

addtoStackPanel(reader.Name,reader.Value,pathMain,pathX,0);
// prevNodeType = reader.Name.ToString();
休息;
}
其他
{
休息;
}

case XmlNodeType.EndElement:
elements.Pop();
休息;
}

}

}
}

解决方案

< blockquote> 5.95
< description>
两个着名的比利时华夫饼干,含有大量真正的枫糖浆

< calories> 650

< food>
< name> Strawberry Belgian Waffles
< price>


7.95
< description>
轻薄比利时华夫饼配草莓和生奶油

< calories> 900

< food>
< name> Berry-Berry比利时华夫饼干
< price>


8.95
< description>
比利时华夫饼配上各种新鲜浆果和鲜奶油

< calories> 900





我的输出

比利时华夫饼我的xPath ==breakfast_menu / food / name
草莓比利时华夫饼我的xPath ==breakfast_menu / food / name
Berry-Berry比利时华夫饼我的xPath ==breakfast_menu / food / name





但我希望输出像

 Belgian Waffles my xPath == breakfast_menu / food [1] / name
Strawberry Belgian Waffles my xPath ==breakfast_menu / food [2] / name
Berry-Berry比利时华夫饼我的xPath ==breakfast_menu / food [3] / name





我尝试过:



 using(XmlReader reader = XmlReader.Create(pathMain))
{
XmlNode nodeTemp;
var elements = new Stack< string>();
var pathX = string.Empty;
var pathXTemp = string.Empty;
string prevNodeType = string.Empty;
string currNodeType = string.Empty;
while(reader.Read())
{

string dg = string.Empty;

if(!reader.IsEmptyElement == true)
{
currNodeType = reader.Name.ToString();
if((reader.NodeType.ToString()==EndElement)||(prevNodeType!= currNodeType))
{
indx = 1;
}
switch(reader.NodeType)
{
case XmlNodeType.Element:
elements.Push(reader.LocalName);

addtoStackPanel(reader.Name,reader.Value,pathMain,pathX,0);
休息;
case XmlNodeType.Text:
if((reader.Value!=)&&(reader.Name!=style))
{


pathX = string.Join(/,elements.Reverse());

addtoStackPanel(reader.Name,reader.Value,pathMain,pathX,0);
// prevNodeType = reader.Name.ToString();
休息;
}
其他
{
休息;
}

case XmlNodeType.EndElement:
elements.Pop();
休息;
}

}

}
}


<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food>
    <name>Belgian Waffles
    <price>$5.95
    <description>
   Two of our famous Belgian Waffles with plenty of real maple syrup
   
    <calories>650

<food>
    <name>Strawberry Belgian Waffles
    <price>$7.95
    <description>
    Light Belgian waffles covered with strawberries and whipped cream
    
    <calories>900

<food>
    <name>Berry-Berry Belgian Waffles
    <price>$8.95
    <description>
    Belgian waffles covered with assorted fresh berries and whipped cream
    
    <calories>900



my output

Belgian Waffles                my xPath== "breakfast_menu/food/name"
Strawberry Belgian Waffles     my xPath== "breakfast_menu/food/name"
Berry-Berry Belgian Waffles    my xPath== "breakfast_menu/food/name"



but i want output like

Belgian Waffles                my xPath== "breakfast_menu/food[1]/name"
Strawberry Belgian Waffles     my xPath== "breakfast_menu/food[2]/name"
Berry-Berry Belgian Waffles    my xPath== "breakfast_menu/food[3]/name"



What I have tried:

using (XmlReader reader = XmlReader.Create(pathMain)) 
            {
                XmlNode nodeTemp;
                var elements = new Stack<string>();
                var pathX = string.Empty;
                var pathXTemp = string.Empty;
                string prevNodeType = string.Empty;
                string currNodeType = string.Empty;
                while (reader.Read())
                {

                    string dg = string.Empty;

                    if (!reader.IsEmptyElement == true)
                    {
                        currNodeType = reader.Name.ToString();
                        if ((reader.NodeType.ToString() == "EndElement") || (prevNodeType != currNodeType))
                        {
                            indx = 1;
                        }
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                elements.Push(reader.LocalName);
                               
                                addtoStackPanel(reader.Name, reader.Value, pathMain, pathX, 0);
                                break;
                            case XmlNodeType.Text:
                                if ((reader.Value != "") && (reader.Name != "style"))
                                {
                                   

                                    pathX = string.Join("/", elements.Reverse());
                                    
                                    addtoStackPanel(reader.Name, reader.Value, pathMain, pathX, 0);
                                    //prevNodeType = reader.Name.ToString();
                                    break;
                                }
                                else
                                {
                                    break;
                                }
                           
                            case XmlNodeType.EndElement:
                                elements.Pop();
                                break;
                        }

                    }
                  
                }
            }

解决方案

5.95 <description> Two of our famous Belgian Waffles with plenty of real maple syrup <calories>650 <food> <name>Strawberry Belgian Waffles <price>


7.95 <description> Light Belgian waffles covered with strawberries and whipped cream <calories>900 <food> <name>Berry-Berry Belgian Waffles <price>


8.95 <description> Belgian waffles covered with assorted fresh berries and whipped cream <calories>900



my output

Belgian Waffles                my xPath== "breakfast_menu/food/name"
Strawberry Belgian Waffles     my xPath== "breakfast_menu/food/name"
Berry-Berry Belgian Waffles    my xPath== "breakfast_menu/food/name"



but i want output like

Belgian Waffles                my xPath== "breakfast_menu/food[1]/name"
Strawberry Belgian Waffles     my xPath== "breakfast_menu/food[2]/name"
Berry-Berry Belgian Waffles    my xPath== "breakfast_menu/food[3]/name"



What I have tried:

using (XmlReader reader = XmlReader.Create(pathMain)) 
            {
                XmlNode nodeTemp;
                var elements = new Stack<string>();
                var pathX = string.Empty;
                var pathXTemp = string.Empty;
                string prevNodeType = string.Empty;
                string currNodeType = string.Empty;
                while (reader.Read())
                {

                    string dg = string.Empty;

                    if (!reader.IsEmptyElement == true)
                    {
                        currNodeType = reader.Name.ToString();
                        if ((reader.NodeType.ToString() == "EndElement") || (prevNodeType != currNodeType))
                        {
                            indx = 1;
                        }
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                elements.Push(reader.LocalName);
                               
                                addtoStackPanel(reader.Name, reader.Value, pathMain, pathX, 0);
                                break;
                            case XmlNodeType.Text:
                                if ((reader.Value != "") && (reader.Name != "style"))
                                {
                                   

                                    pathX = string.Join("/", elements.Reverse());
                                    
                                    addtoStackPanel(reader.Name, reader.Value, pathMain, pathX, 0);
                                    //prevNodeType = reader.Name.ToString();
                                    break;
                                }
                                else
                                {
                                    break;
                                }
                           
                            case XmlNodeType.EndElement:
                                elements.Pop();
                                break;
                        }

                    }
                  
                }
            }


这篇关于如何通过索引获取xpath以动态更新XML文件C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆