[英]Parsing xml using XDocument - Deserialization
我有以下xml
<?xml version="1.0" encoding="UTF-8"?>
<Actions>
<add order-id="1" symbol="ABC" price="5" quantity="200" />
<add order-id="2" symbol="123" price="15" quantity="100" />
<add order-id="3" symbol="ABC" price="5" quantity="300" />
<add order-id="4" symbol="ABC" price="7" quantity="150" />
<edit order-id="1" price="7" quantity="200" />
<remove order-id="4" />
<add order-id="5" symbol="123" price="17" quantity="300" />
<add order-id="6" symbol="123" price="12" quantity="150" />
<edit order-id="3" price="7" quantity="200" />
<remove order-id="5" />
</Actions>
我需要使用linq将其解析为以下对象结构:
internal class OrderAction
{
private readonly Action action;
private readonly Order order;
public Action Action { get { return action; }}
public Order Order { get { return order; }}
public OrderAction(Action action,Order order)
{
this.action = action;
this.order = order;
}
}
动作是public enum Action { ADD, REMOVE, EDIT }
命令如下:
class Order
{
public Order(long orderId, String symbol, int price, int quantity)
{
this.orderId = orderId;
this.symbol = symbol;
this.price = price;
this.quantity = quantity;
}
public long orderId { get; private set; }
public String symbol { get; private set; }
public int price { get; private set; }
public int quantity { get; private set; }
}
我需要将xml加载到xdocument中,并在文件中找到所有IEnumerable的orderactions。 我如何做到这一点,而不必求助于序列化属性?
在“编辑和删除”的情况下,缺少的Order
属性的值应该是什么?我假设string
和int
的默认值...
这将是LINQ语句(假设您的XDocument
称为doc
):
var result = doc
.Root
.Elements()
.Select(elem => new OrderAction
(
(Action)Enum.Parse(typeof(Action), elem.Name.LocalName.ToUpper()),
new Order
(
elem.Attributes("order-id").Select(x => long.Parse(x.Value)).FirstOrDefault(),
elem.Attributes("symbol").Select(x => x.Value).FirstOrDefault(),
elem.Attributes("price").Select(x => int.Parse(x.Value)).FirstOrDefault(),
elem.Attributes("quantity").Select(x => int.Parse(x.Value)).FirstOrDefault()
)
));
这是我最好的镜头
XElement doc = XElement.Load("d:\\tst.xml");
List<OrderAction> lst = doc.Elements().Select(x =>
new OrderAction(
(Action)
Enum.Parse(typeof (Action),
x.Name.ToString().ToUpper()),
new Order(
long.Parse(x.Attribute("order-id").Value),
x.Attribute("symbol") != null ? x.Attribute("symbol").Value : "",
x.Attribute("price") != null ? int.Parse(x.Attribute("price").Value) : 0,
x.Attribute("quantity") != null ? int.Parse(x.Attribute("quantity").Value): 0))
).ToList();
我花了一段时间...我不习惯这么大的linq解析
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.