Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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# 读取XML节点的值_C#_Xml - Fatal编程技术网

C# 读取XML节点的值

C# 读取XML节点的值,c#,xml,C#,Xml,我需要获取XML文件中节点的值 我的XML文件如下所示: <?xml version="1.0" encoding="UTF-8"?> <PRODUCTS> <IPHONE> <NAME>iPhone 5s</NAME> <MODEL>5s</MODEL> <PRICE>899</PRICE> <COLOR>Gold</COLOR>

我需要获取XML文件中节点的值

我的XML文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<PRODUCTS>
<IPHONE>
    <NAME>iPhone 5s</NAME>
    <MODEL>5s</MODEL>
    <PRICE>899</PRICE>
    <COLOR>Gold</COLOR>
</IPHONE>

iphone5s
5秒
899
黄金
我想从文件中获取文本(iPhone 5s)。 我尝试了在互联网上找到的几种方法:

protected void Page_Load(object sender, EventArgs e)
{
    String[][] products = new String[3][];
    int i = 0;
    int j = 0;
    System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader("../XML-Test/Webshop-products.xml");
    while (reader.Read()) {
        if (reader.NodeType == XmlNodeType.Element)
        {
            if (reader.LocalName.Equals("NAME"))
            {
                //Name of product
                products[i][j] = reader.ReadInnerXml();
                j++;
            }
            if (reader.LocalName.Equals("MODEL"))
            {
                //Model
                products[i][j] = reader.ReadString();
                j++;
            }
            if (reader.LocalName.Equals("PRICE"))
            {
                //Price
                products[i][j] = reader.Value;
                j++;
            }
            if (reader.LocalName.Equals("COLOR"))
            {
                //Color
                products[i][j] = reader.Value;
                j++;
                i++;
            }
        }
    }
    for (int k = 0; k < products.Length; k++)
    {
        for (int l = 0; l < products[k].Length; l++)
        {
            Console.Write(products[k][l]);
        }
    }
}
受保护的无效页面加载(对象发送方,事件参数e)
{
字符串[][]产品=新字符串[3][];
int i=0;
int j=0;
System.Xml.XmlTextReader=new System.Xml.XmlTextReader(“../Xml Test/Webshop products.Xml”);
while(reader.Read()){
if(reader.NodeType==XmlNodeType.Element)
{
if(reader.LocalName.Equals(“NAME”))
{
//产品名称
products[i][j]=reader.ReadInnerXml();
j++;
}
if(reader.LocalName.Equals(“MODEL”))
{
//模型
products[i][j]=reader.ReadString();
j++;
}
if(reader.LocalName.Equals(“PRICE”))
{
//价格
产品[i][j]=读者价值;
j++;
}
if(reader.LocalName.Equals(“COLOR”))
{
//颜色
产品[i][j]=读者价值;
j++;
i++;
}
}
}
对于(int k=0;k
似乎没有办法奏效。当我运行项目(ASP.NET项目)时,出现以下错误:

System.NullReferenceException:对象引用未设置为对象的实例


如何获取节点的值?

您可以使用Linq To Xml

假设您在
产品

var products = XDocument.Load(filename).Root
                .Elements()
                .Select(x => new
                {
                    Product = x.Name.LocalName,
                    Name = (string)x.Element("NAME"),
                    Model = (string)x.Element("MODEL"),
                    Price = (decimal)x.Element("PRICE"),
                    Color = (string)x.Element("COLOR")
                })
                .ToList();

您可能还想看看下面给出的方法

(一)

2)


3)

我建议使用Linq到Xml:

var xdoc = XDocument.Load("../XML-Test/Webshop-products.xml");
var p = xdoc.Root.Element("IPHONE"); // get first IPHONE from file
if (iPhoneElement == null)
   return; // handle case when there is no IPHONE in xml file

var iPhone = new { 
      Name = (string)p.Element("NAME"),
      Model = (string)p.Element("MODEL"),
      Price = (decimal)p.Element("PRICE"),
      Color = (string)p.Element("COLOR")          
};
然后您可以使用
iPhone
对象的名称、型号、价格或颜色。例如

iPhone.Name
注意-如果文件中有许多iPhone,您可以将它们全部抓取:

var iPhones = from p in xdoc.Root.Elements("IPHONE")
              select new {
                  Name = (string)p.Element("NAME"),
                  Model = (string)p.Element("MODEL"),
                  Price = (decimal)p.Element("PRICE"),
                  Color = (string)p.Element("COLOR") 
              };

@Hack4Life您是否试图同时使用这两种方法?Linq已成功导入。试图复制您的代码并将其粘贴到我的项目中。1) 从。。。p已在上面的行中删除。Visual Studio告诉我,这与先前对变量p2的删减有冲突)是的,文件中有许多iPhone。。所以我复制了第二个代码部分。现在Visual Studio告诉我找不到SELECT。很抱歉,如果有一些愚蠢的错误,但我是C#@Hack4Life的初学者,那么您已经在方法的范围内定义了名为
p
的变量。要么重命名该变量,要么在queryok中使用不同的变量名,现在它似乎可以工作了!那么,当列表中有更多iPhone时,我如何访问这些元素?变量是数组吗?如何查看变量的值
Console.WriteLine(iPhone)
似乎不起作用。Visual Studio告诉我:“System.Collections.Generic.IEnumerable”没有“Select”的定义…@Hack4Life您需要使用System.Linq添加
到文件的顶部。啊!非常感谢,我一直使用
System.Xml.Linq