使用 XDocument 按位置解析 XML
Parsing XML by position using XDocument
我有一些来自第三方的 XML,看起来像这样:
<Breakfasts>
<Name>Cornflakes</Name>
<Description>Just add milk</Name>
<Name>Toast</Name>
<Name>Muesli</Name>
<Description>Healthy option</Description>
</Breakfasts>
我们要根据节点在XML中的位置来推断Name和Description的关系。所以 Cornflakes 是 "Just add milk",Toast 没有描述,Muesli 是 "Healthy option" 等等。
我有一个 class 叫做早餐,看起来像这样:
public class Breakfast
{
public string Name { get; set; }
public string Description { get; set; }
}
如何将此 XML 解析(也许使用 XDocument?)到早餐列表中?
糟糕 - 多么糟糕的格式。我可能会这样做:
var list = doc.Descendants("Name").Select(MakeBreakfast).ToList();
...
static Breakfast MakeBreakfast(XElement nameElement)
{
string name = (string) nameElement;
var nextElement = nameElement.ElementsAfterSelf().FirstOrDefault();
string description =
nextElement != null && nextElement.Name.LocalName == "Description"
? (string) nextElement
: null;
return new Breakfast { Name = name, Description = description };
}
这就是我要做的:
var breakfasts =
doc.Root.Elements("Name").Select(x => new Breakfast()
{
Name = x.Value,
Description =
x.NextNode as XElement != null
? (x.NextNode as XElement).Name == "Description"
? (x.NextNode as XElement).Value
: ""
: "",
}).ToList();
这给了我:
我有一些来自第三方的 XML,看起来像这样:
<Breakfasts>
<Name>Cornflakes</Name>
<Description>Just add milk</Name>
<Name>Toast</Name>
<Name>Muesli</Name>
<Description>Healthy option</Description>
</Breakfasts>
我们要根据节点在XML中的位置来推断Name和Description的关系。所以 Cornflakes 是 "Just add milk",Toast 没有描述,Muesli 是 "Healthy option" 等等。
我有一个 class 叫做早餐,看起来像这样:
public class Breakfast
{
public string Name { get; set; }
public string Description { get; set; }
}
如何将此 XML 解析(也许使用 XDocument?)到早餐列表中?
糟糕 - 多么糟糕的格式。我可能会这样做:
var list = doc.Descendants("Name").Select(MakeBreakfast).ToList();
...
static Breakfast MakeBreakfast(XElement nameElement)
{
string name = (string) nameElement;
var nextElement = nameElement.ElementsAfterSelf().FirstOrDefault();
string description =
nextElement != null && nextElement.Name.LocalName == "Description"
? (string) nextElement
: null;
return new Breakfast { Name = name, Description = description };
}
这就是我要做的:
var breakfasts =
doc.Root.Elements("Name").Select(x => new Breakfast()
{
Name = x.Value,
Description =
x.NextNode as XElement != null
? (x.NextNode as XElement).Name == "Description"
? (x.NextNode as XElement).Value
: ""
: "",
}).ToList();
这给了我: