2012-01-10 118 views
0

我有这样的XML:解析SOAP XML

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <SampleResponse xmlns="http://tempuri.org/"> 
      <SampleResult> 
       <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
           xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
        <NewDataSet xmlns=""> 
         <Table diffgr:id="Table1" msdata:rowOrder="0"> 
          <tag1>tag1 text</tag1> 
          <tag2>tag2 text</tag2> 
         </Table> 
         <Table diffgr:id="Table2" msdata:rowOrder="1"> 
          <tag1>tag1 text</tag1> 
          <tag2>tag2 text</tag2> 
         </Table> 
        </NewDataSet> 
       </diffgr:diffgram> 
      </SampleResult> 
     </SampleResponse> 
    </soap:Body> 
</soap:Envelope> 

所以,我用下面的代码解析上面的XML:

string XMLresponse = e.response; 
var XResult = XElement.Parse(XMLresponse); 

var result = XResult.Descendants("Table") 
    .Select(t => new 
    { 
     tag1 = t.Descendants("tag1").First().Value, 
     tag2 = t.Descendants("tag2").First().Value, 
    }); 

foreach (var res in result) 
{ 
    string str = res.tag1; // here i am able get the response 
} 

listbox.ItemsSource = result; 

但我不能将其绑定到列表框。我有一个列表框象下面这样:

<ListBox x:Name="listbox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock Text="Sample" ></TextBlock> 
       <TextBlock Text="{Binding tag1}" ></TextBlock> 
       <TextBlock Text="{Binding tag2}" ></TextBlock> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

在我已经加入一个TextBlock,其被重复两次列表框。但动态文本块并不与数据绑定。

回答

1

这两个动态值表示为字段,而不是属性。既然你只能绑定到XAML中的属性,你需要用你的两个属性创建一个强类型的数据结构,然后选择这些值。

是这样的:

class V 
{ 
    public string tag1 { get; set; } 
    public string tag2 { get; set; } 
} 

var result = XResult.Descendants("Table").Select(t => new V 
      { 
       tag1 = t.Descendants("tag1").First().Value, 
       tag2 = t.Descendants("tag2").First().Value, 
      }); 
+0

感谢您的响应克劳斯乔根森。这个解决方案为我工作。 – 2012-01-16 06:13:12

+0

克劳斯还有一个问题。在我的XML中有时会丢失名为tag2的标签。在这里我想像上面解析它,如果特定的标签有时丢失,有时它应该是空的该对象。 – 2012-01-16 14:37:08