c# - XML 反序列化为 C# 对象
问题描述
我正在尝试将 Xml 数据转换为 C# 对象。
我的 C# 类是这样的:
Public Class XmlModel {
public string NodeName { get; set; }
public int NodeId { get; set; }
public int ParentId { get; set; }
}
我能够获取 XML 的所有节点并创建对象列表。这是我获取节点的代码。
public List<XMLModel2> ProcessXml()
{
XMLRepository xr = new XMLRepository(new POCEntities());
XmlDocument doc = new XmlDocument();
var a = xr.GetXmlFileById(1);
doc.LoadXml(a.XmlFile);
XmlNode rootNode = doc.DocumentElement;
GetChildNodeWithId(rootNode);
return NodeList;
}
public void GetChildNodeWithId(XmlNode node)
{
AddNode(node);
XmlNodeList children = node.ChildNodes;
if (children != null)
{
for (int i = 0; i < children.Count; i++)
{
GetChildNodeWithId(children[i]);
}
}
}
public void AddNode(XmlNode node)
{
XMLModel xml = new XMLModel();
xml.NodeName = node.Name;
xml.NodeValue = node.Value;
NodeList.Add(xml);
}
现在我在将 xml 转换为
<parent>
<child>
<key> one </key>
<key> two </key>
<key> Three </key>
</child>
<child>
<key> one </key>
<key> two </key>
<key> Three </key>
</child>
</parent>
XMLModel 列表应该是这样的:
节点名称:父节点,节点 ID:1,父 ID:0
节点名称:子节点,节点 ID=2,父 ID:1
NodeName:键,NodeId:3,ParentId:2
NodeName:键,NodeId:4,ParentId:2
NodeName:键,NodeId:5,ParentId:2
节点名称:子节点,节点 ID=6,父 ID:1
NodeName:键,NodeId:7,ParentId:6
NodeName:键,NodeId:8,ParentId:6
NodeName:键,NodeId:9,ParentId:6
解决方案
您应该能够使用LINQ to XML做到这一点
var xml =
XElement.Parse(@"<parent>
<child>
<key> one </key>
<key> two </key>
<key> Three </key>
</child>
<child>
<key> one </key>
<key> two </key>
<key> Three </key>
</child>
</parent>");
var elementsAndIndex =
xml
.DescendantsAndSelf()
.Select((node, index) => new { index = index + 1, node })
.ToList();
List<XmlModel> elementsWithIndexAndParentIndex =
elementsAndIndex
.Select(
elementAndIndex =>
new
{
Element = elementAndIndex.node,
Index = elementAndIndex.index,
ParentElement = elementsAndIndex.SingleOrDefault(parent => parent.node == elementAndIndex.node.Parent)
})
.Select(
elementAndIndexAndParent =>
new XmlModel
{
NodeName = elementAndIndexAndParent.Element.Name.LocalName,
NodeId = elementAndIndexAndParent.Index,
ParentId = elementAndIndexAndParent.ParentElement == null ? 0 : elementAndIndexAndParent.ParentElement.index
})
.ToList();
推荐阅读
- python - 将 FloatCanvas 添加到面板 - Wx Python
- mysql - 我们怎样才能找到总数。我们在特定时间段内发出的查询数?
- amazon-web-services - Instance Store 和 EBS - 默认使用哪个?
- docker - 使用较新版本的映像将 docker 容器部署到生产环境,而无需停止当前正在运行的容器
- reactjs - 图像加载时自动滚动中断
- kubernetes - 如何从外部访问 EC2 中 Minikube 中部署为 NodePort 的服务
- api - 一次调用所有页面的 API 请求?
- python - 有什么方法可以绕过错误?
- reactjs - videodk.live 的 React Native 示例代码返回错误“无效的钩子调用。只能在内部调用钩子......”
- reactjs - 反应选择未在项目上显示图标