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:                     

相关文章: