Silverlight由于用的是Silverlight版的.NET Framework,不是完整版,所以在Silverlight下面处理xml有点不一样。XmlDocument没有了,取而代之的是XDocument,是Linq的东东,使用起来还是很方便的:
1: XDocument xmlProducts = XDocument.Parse(xmlContent);
)
new
4: {
).Value),
).Value
7: };
XElement是XDocument下面的东东,XDocument可以添加它:
new StringBuilder();
,
, 1),
, 2),
, 3),
, 4),
, 5)
8: );
,
)
11: );
12: xmlTree.Add(
in srcTree.Elements()
int)el >= 3
15: select el
16: );
17: output.Append(xmlTree + Environment.NewLine);
18:
19: OutputTextBlock.Text = output.ToString();
当然,XElement也可以从xml文件加载:
object sender, RoutedEventArgs e)
2: {
3: DataGrid1.ItemsSource = GetStatusReport();
4: }
5:
public List<Status> GetStatusReport()
7: {
new List<Status>();
9:
);
11:
in doc.Elements()
13: select GetStatus(el)).ToList();
14:
return statusReport;
16: }
17:
private Status GetStatus(XElement el)
19: {
new Status();
).Value;
).Value);
return s;
24: }
在WCF Ria Service的DomainService可以返回一个XElement类型的数据,它比XDocument更便携:
1: [Invoke]
2: [RequiresAuthentication]
string param)
4: {
// linq query...
//return XElement
7: }
返回的XElement假设是这样的XML:
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
如何读取XElement?如何用递归把上面的XML转换为树形的无限极的实体类呢?最方便的当然是用xml.linq。另外一种方法是用XmlReader:
new StringReader(xmlElement.ToString(SaveOptions.None))))
2: {
while (reader.Read())
4: {
continue;
6:
//From 1st line to last line, including comments, EndElement...
//....
9: }
10: }
无限递归XElement - XElement.Elements()
还有一种方法是递归XElement – XElment.Elements(),如果你需要把XElement转为树形复合结构的类列表(类下面有子类,无限层级),需要用这个方法:
//入口函数
private IEnumerable<<YourEntity> GetAllNodes(XElement element)
3: {
new List<YourEntity>();
5:
in element.Elements())
7: {
if (elem.HasElements)
9: {
10: var node = CreateNode(elem);
11:
// 这里面有递归
13: {
14: node.Children.Add(item);
15: }
16: ret.Add(node);
17: }
else
19: {
20: ret.Add(CreateNode(elem));
21: }
22:
23: }
return ret;
25: }
26:
//递归调用
private IEnumerable<YourEntity> CreateNodeCollection(XElement element)
29: {
new List<YourEntity>();
31:
in element.Elements())
33: {
if (elem.HasElements)
35: {
36: var node = CreateNode(elem);
in CreateNodeCollection(elem))
38: {
39: node.Children.Add(item);
40: }
41: ret.Add(node);
42: }
else
44: {
45: ret.Add(CreateNode(elem, param));
46: }
47: }
return ret;
49: }
50:
private YourEntity CreateNode(XElement element)
52: {
new YourEntity();
54: ret.Name = element.Name.ToString();
55: ret.Value = element.Value;
56: ret.Tag = element.HasAttributes ? element.FirstAttribute.Value : element.Value;
return ret;
58: }
59: