我有一个类似于下面的 XML 和С#项目中的一个列表,这些列表必须部分地根据子名称绑定到该XML,使用数据名称作为DisplayMember并数据值作为ValueMember。
我的问题是:如何使用 LINQ ,通过其属性查找特定节点并将其子节点用作数据源?
例如如果用户希望查看 transaction_type ,则列表必须仅绑定到第一个子节点
<Root>
<Child Name="transaction_type">
<Data val="1" Name="authorization"/>
<Data val="2" Name="confirm"/>
<Data val="3" Name="purchase"/>
</Child>
<Child Name= "transaction_status">
<Data val="1" Name ="initiated"/>
<Data val="2" Name ="external processing"/>
</Child>
<Child Name ="country_by_bin">
<Data val="AF" Name="Afghanistan"/>
<Data val="AX" Name="Aland Islands"/>
<Data val="AL" Name="Albania"/>
<Data val="DZ" Name="Algeria"/>
<Data val="AS" Name="American Samoa"/>
</Child>
答案 0 :(得分:1)
您必须遍历Child
个节点并获得特定名称的子节点。
然后,您将获得显示成员和值成员列表,如
public class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"C:\Users\xxx\source\repos\ConsoleApp2\Files\XMLFile2.xml");
var childs = doc.Descendants("Child")
.Single(c => c.Attribute("Name").Value == "transaction_type")
.Elements().ToList();
var displayMembers = childs.Attributes("Name").Select(x => x.Value).ToList();
var valueMembers = childs.Attributes("val").Select(x => x.Value).ToList();
}
}
输出:
答案 1 :(得分:1)
在这里您可以找到执行xml到DataSet甚至实体转换的代码。尝试使用此转换,然后执行LINQ查询。
public static string SerializeObject<T>(T dataObject)
{
if (dataObject == null)
throw new InvalidOperationException("Object is NULL");
using (StringWriter stringWriter = new StringWriter())
{
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stringWriter, dataObject);
return stringWriter.ToString();
}
}
public static T DeserializeObject<T>(string xml)
where T : class
{
if (string.IsNullOrEmpty(xml))
throw new InvalidOperationException("Empty XML ERROR");
using (var stringReader = new StringReader(xml))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
}
实体示例:
[XmlRoot(ElementName = "CLIENTE")]
public class Client
{
[XmlElement(ElementName = "ROW")]
public List<ClientInfo> Row { get; set; }
}
[Serializable]
[XmlRoot(ElementName = "ROW")]
public class ClientInfo
{
[XmlElement(ElementName = "TABELA")]
public string NomeTabela { get; set; }
[XmlElement(ElementName = "ID_CLIENTE", Type = typeof(int))]
public int ClienteID { get; set; }
[XmlElement(ElementName = "ID_CLIENTE_RECADASTRO")]
public string ClientIDRecadastro { get; set; }
[XmlElement(ElementName = "NOME_CLIENTE")]
public string NomeCliente { get; set; }
[XmlElement(ElementName = "TIPO_CLIENTE")]
public string TipoCliente { get; set; }
[XmlIgnore]
public DateTime DataRecadastro { get; set; }