获取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的最简单方法是使用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 });
}
}
}
}
}