在c#中读取XML数组

本文关键字:XML 数组 读取 | 更新日期: 2023-09-27 18:15:48

我试图在XML中读取数组,但我的代码不返回结果

XML:

<ArrayOfProductoModel
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://schemas.datacontract.org/2004/07/WebApi.Models">
    <ProductoModel>
        <descripcion>descripcion 1</descripcion>
        <fecha_registro>2016-03-01</fecha_registro>
        <id_producto>1</id_producto>
        <id_proveedor>1</id_proveedor>
        <nombre_producto>producto 1</nombre_producto>
        <precio>200</precio>
    </ProductoModel>
    <ProductoModel>
        <descripcion>descripcion 3</descripcion>
        <fecha_registro>2016-08-02</fecha_registro>
        <id_producto>3</id_producto>
        <id_proveedor>3</id_proveedor>
        <nombre_producto>producto 3</nombre_producto>
        <precio>500</precio>
    </ProductoModel>
</ArrayOfProductoModel>

代码:

XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(content);
XmlNodeList nodelist = xDoc.SelectNodes("ArrayOfProductoModel/ProductoModel");
foreach (XmlNode node in nodelist) 
{
    MessageBox.Show(node.SelectSingleNode("descripcion").InnerText);
}

我可以读取数组吗?

在c#中读取XML数组

问题是导入的命名空间。您可以忽略命名空间,如下所示:

XmlDocument xDoc = new XmlDocument();
xDoc.Load(content);
XmlNodeList nodelist = xDoc.DocumentElement.SelectNodes("*[local-name()='ProductoModel']");
foreach (XmlNode node in nodelist)
{
    MessageBox.Show(node.SelectSingleNode("*[local-name()='descripcion']").InnerText);
}

或者,您可以使用XmlNamespaceManager,如下所示:

XmlDocument xDoc = new XmlDocument();
xDoc.Load(content);
XmlNamespaceManager manager = new XmlNamespaceManager(xDoc.NameTable);
manager.AddNamespace("MYNS", "http://schemas.datacontract.org/2004/07/WebApi.Models");
XmlNodeList nodelist = xDoc.DocumentElement.SelectNodes("MYNS:ProductoModel", manager);
foreach (XmlNode node in nodelist)
{
     MessageBox.Show(node.SelectSingleNode("MYNS:descripcion", manager).InnerText);
}

另一个解决方案是使用Linq to XML

var xml = @"<ArrayOfProductoModel
    xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""
    xmlns=""http://schemas.datacontract.org/2004/07/WebApi.Models"">
    <ProductoModel>
        <descripcion>descripcion 1</descripcion>
        <fecha_registro>2016-03-01</fecha_registro>
        <id_producto>1</id_producto>
        <id_proveedor>1</id_proveedor>
        <nombre_producto>producto 1</nombre_producto>
        <precio>200</precio>
    </ProductoModel>
    <ProductoModel>
        <descripcion>descripcion 3</descripcion>
        <fecha_registro>2016-08-02</fecha_registro>
        <id_producto>3</id_producto>
        <id_proveedor>3</id_proveedor>
        <nombre_producto>producto 3</nombre_producto>
        <precio>500</precio>
    </ProductoModel>
</ArrayOfProductoModel>";
 var xDoc = XDocument.Parse(xml);
 var ns = xDoc.Root.Name.Namespace;
 var nodelist = xDoc.Element(ns + "ArrayOfProductoModel").Elements(ns + "ProductoModel");
 foreach (var node in nodelist)
 {
      MessageBox.Show(node.Element(ns + "descripcion").Value);
 }

不要忘记在本地名称前加上namespace

起初,我认为问题在xDoc.LoadXml(内容);你试一试:xDoc.Load (filePathXml);

第二,我认为问题在
XmlNodeList nodelist = xDoc.SelectNodes("ArrayOfProductoModel/ProductoModel");
foreach (XmlNode node in nodelist) 
{
        MessageBox.Show(node.SelectSingleNode("descripcion").InnerText);
}

:

XmlNode rootNode = doc.SelectSingleNode(@"/ArrayOfProductoModel");
 var listProductModel = rootNode.SelectNodes(@"ProductoModel");
foreach (XmlNode node in listProductModel) 
{
    MessageBox.Show(node.SelectSingleNode("descripcion").InnerText);
}