2012-07-26 111 views
0

我需要向我的WP7應用程序的Web服務發送XML消息,但我沒有經驗。WP7 - 構建XML消息

這是使Web服務需要我發送XML格式:

<pfpMessage version='1.5'> 
<header> 
    <source> 
     <component type="pfsvc" role="master"> 
     <host ip="" hostname="" serverId=""/> 
     </component> 
    </source> 
    </header> 
    <request request-id='1288730909' async='0' response-url='' language='en'> 
    <phoneAppValidateDeviceTokenRequest > 
     <phoneAppContext > 
     <guid>...</guid> 
     <deviceToken >...</deviceToken> 
     <version >1.0.0</version> 
     </phoneAppContext> 
     <validationResult >yes</validationResult> 
    </phoneAppValidateDeviceTokenRequest> 
    </request> 
</pfpMessage> 

這是代碼的一小部分,我已經寫了:

XDocument doc = new XDocument(); 

    // start message 
    XElement root = doc.Element("pfpMessage"); 
    root.SetAttributeValue("version", 1.5); 
    doc.Add(root); 

    // message header 
    XElement header = doc.Element("header"); 
    root.Add(header); 
    XElement source = doc.Element("source"); 
    header.Add(source); 
    XElement component = doc.Element("component"); 
    component.SetAttributeValue("type", "pfsdk"); 
    source.Add(component); 
    XElement element = doc.Element("host"); 
    element.SetAttributeValue("ip", pfAuthParams.IpAddress); 
    element.SetAttributeValue("hostname", pfAuthParams.Hostname); 
    component.Add(element); 

的部分問題在於SetAttributeValue函數保持拋出異常,即使它看起來與MSDN示例完全相同。

這是構建符合格式的XML消息的正確方法嗎?

編輯:這將導致一個InvalidOperationException:

XDocument doc = new XDocument(
      new XElement("pfpMessage", 
       new XAttribute("version", 1.5), 
       new XElement("header", 
        new XElement("source", 
         new XElement("component", 
          new XAttribute("type", "pfsdk"), 
          new XElement("host", 
           new XAttribute("ip", pfAuthParams.IpAddress), 
           new XAttribute("hostname", pfAuthParams.Hostname) 
          ) 
         ) 
        ) 
       ) 
      ), 
      new XElement("request", 
       new XAttribute("request-id", y), 
       new XAttribute("async", 0), 
       new XAttribute("response-url", ""), 
       new XAttribute("language", "en"), 
       new XElement("phoneAppValidateDeviceTokenRequest", 
        new XElement("phoneAppValidateContext"), 
        new XElement("guid", (Application.Current as App).SharedGUID), 
        new XElement("deviceToken", (Application.Current as App).SharedURI) 
        ), 
        new XElement("version", "1.0.0") 
       )     
     ); 

回答

2

這裏:

XElement root = doc.Element("pfpMessage"); 
root.SetAttributeValue("version", 1.5); 

...你假設元素已經存在。 Element方法在您調用的容器中找到一個元素。你只有創建了該文件,所以它是空的。您需要創建一個新的元素

XElement root = new XElement("pfpMessage"); 

同樣在其他地方。

這裏做更清晰的方式:

XDocument doc = new XDocument(
    new XElement("pfpMessage", 
     new XAttribute("version", 1.5), 
     new XElement("header", 
      new XElement("source", 
       new XElement("component", 
        new XAttribute("type", "pfsdk"), 
        new XElement("host", 
         new XAttribute("ip", pfAuthParams.IpAddress), 
         new XAttribute("hostname", pfAuthParams.Hostname) 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

(當然,你可以,如果你想在年底摺疊支架)

這是構建文檔的多個聲明的方式 - 這是更接近LINQ to XML的精神。當然你可以分別手動創建每個元素,並將其附加到父級,但它更囉嗦。

+0

感謝您的幫助!你介意看看我的編輯?我得到一個InvalidOperationException並且無法弄清楚。 – SirJames 2012-07-26 20:03:34

+0

@SirJames:*當您在帖子中提及某個例外時,總是*包含例外的全部細節。理想情況下是完整的堆棧跟蹤,但至少*消息。 – 2012-07-26 20:04:13

+0

@SirJames :(在這種情況下,我可以解決這個問題,但是如果你發佈了這個消息,會更簡單)。你提供了兩個頂層元素('pfpMessage'和'request')。一個XML文檔只能有一個根元素。你應該在'header'元素的同一級別構造'request'元素。 – 2012-07-26 20:05:11