获取XML C#的引用标记子级

本文关键字:引用 XML 获取 | 更新日期: 2023-09-27 18:10:48

XML:

<?xml version="1.0" encoding="UTF-8"?>
<clientes>
    <cliente>
        <nome>Cliente1</nome>
        <contatos>
            <contato>
                <nome>Contato1</nome>
            </contato>
            <contato>
                <nome>Contato2</nome>
            </contato>
        </contatos>
    </cliente>  
    <cliente>
        <nome>Cliente2</nome>
        <contatos>
            <contato>
                <nome>Contato3</nome>
            </contato>
            <contato>
                <nome>Contato4</nome>
            </contato>
        </contatos>
    </cliente>
</clientes>

我必须将CLIENTE和他的CONTATOS保存在数据库中的两个表中,但我只能一次获取每个TAG,因此它们没有参考:

   DataSet ds = new DataSet();
   ds.ReadXml("c:'xmlfile.xml");
   ds.Tables[0];
   //Here can get CLIENTES
   ds.Tables[1];
   //Here can get CONTATOS

我不能创建引用,CLIENTE x CONTATOS的外键,因为我没有与该CLIENTE相关的CONTATO。

获取XML C#的引用标记子级

处理XML的最简单方法是使用XElement。如果实际的XML文档位于比所示示例复杂得多的名称空间中,那么请注意XElement在名称空间中的作用并不好。

然而,如果它是一个非常简单的XML模式,如上所述,

XElement doc = XElement.Load("c:'xmlfile.xml");
foreach (XElement element in elementsInDoc)
    Console.WriteLine(element);  // or add to database
foreach(XElement client in doc.Elements("cliente"))
{
     foreach(XElement contato in client.Elements("contato"))
     {
          //add name to database
     }
}

希望这能有所帮助。

我认为在对象之间没有公共字段是不可能的。当您考虑如何在数据库中持久化它们时,您需要在两个表中都有一列来创建关系。

如果您有机会操作XML,可以通过添加公共列和关系来解决问题。

示例XML:

<clientes>
    <cliente id="1">
        <nome>Cliente1</nome>
        <contatos>
            <contato cliente_id="1">
                <nome>Contato1</nome>
            </contato>
            <contato cliente_id="1">
                <nome>Contato2</nome>
            </contato>
        </contatos>
    </cliente>  
    <cliente id="2">
        <nome>Cliente2</nome>
        <contatos>
            <contato cliente_id="2">
                <nome>Contato3</nome>
            </contato>
            <contato cliente_id="2">
                <nome>Contato4</nome>
            </contato>
        </contatos>
    </cliente>
</clientes>

以及关系:

DataSet ds = new DataSet();
ds.ReadXml(@"xmlfile1.xml");
ds.Relations.Add(
    "cliente-contato-rel", 
    ds.Tables["cliente"].Columns["id"],
    ds.Tables["contato"].Columns["cliente_id"]);

建立关系后,您可以访问子行/父行,例如:

ds.Tables["contato"].Rows[3].GetParentRow("cliente-contato-rel").ItemArray

将返回

{object[3]}
    [0]: "Cliente2"
    [1]: 1
    [2]: "2"

试试这个。你可以在Excel中设计表格,这样你就可以很容易地看到结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "<?xml version='"1.0'" encoding='"UTF-8'"?>" +
                    "<clientes>" +
                        "<cliente>" +
                            "<nome>Cliente1</nome>" +
                            "<contatos>" +
                                "<contato>" +
                                    "<nome>Contato1</nome>" +
                                "</contato>" +
                                "<contato>" +
                                    "<nome>Contato2</nome>" +
                                "</contato>" +
                            "</contatos>" +
                        "</cliente>" +
                        "<cliente>" +
                            "<nome>Cliente2</nome>" +
                            "<contatos>" +
                                "<contato>" +
                                    "<nome>Contato3</nome>" +
                                "</contato>" +
                                "<contato>" +
                                    "<nome>Contato4</nome>" +
                                "</contato>" +
                            "</contatos>" +
                        "</cliente>" +
                    "</clientes>";
            XDocument doc = XDocument.Parse(input);
            DataSet ds = new DataSet();
            //ds.ReadXml("c:'xmlfile.xml");
            ds.Tables.Add("CLIENTES");
            DataTable dtClientes = ds.Tables["CLIENTES"];
            dtClientes.Columns.Add("CLIENTES", typeof(string));
            ds.Tables.Add("CONTATOS");
            DataTable dtContatos = ds.Tables["CONTATOS"];
            dtContatos.Columns.Add("CLIENTES", typeof(string));
            dtContatos.Columns.Add("CONTATOS", typeof(string));
            var clientes = doc.Descendants("cliente").Select(x => new {
                nome = x.Element("nome").Value,
                contatos = x.Descendants("contato").Select(y => y.Element("nome").Value).ToList()
            }).ToList();
            foreach (var cliente in clientes)
            {
                dtClientes.Rows.Add(new object[] { cliente.nome });
                foreach (var contato in cliente.contatos)
                {
                    dtContatos.Rows.Add(new object[] { cliente.nome, contato });
                }
            }
        }
    }
}
​