WP7-构建XML消息

WP7-构建XML消息,xml,silverlight,windows-phone-7,Xml,Silverlight,Windows Phone 7,我需要为我的WP7应用程序向web服务发送XML消息,但我没有这样做的经验 这是web服务需要我发送XML的格式: <pfpMessage version='1.5'> <header> <source> <component type="pfsvc" role="master"> <host ip="" hostname="" serverId=""/> </component&

我需要为我的WP7应用程序向web服务发送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>
问题的一部分在于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")
                )                   
        );
在这里:

。。。您假设元素已经存在。
Element
方法在调用它的容器中查找元素。您刚刚创建了文档,因此它是空的。您需要创建一个新元素:

其他地方也是如此

这里有一个更清晰的方法:

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的精神。当然,您可以分别手动创建每个元素并将其附加到父元素,但这更冗长。

谢谢您的帮助!你介意看一下我的编辑吗?我收到了一个InvalidOperation异常,无法解决它。@SirJames:当你在帖子中提到异常时,一定要包括该异常的全部细节。理想情况下是完整的堆栈跟踪,但至少是消息。@SirJames:(在本例中,我可以计算出来,但如果您发布了消息,则会更简单。)您提供了两个顶级元素(
pfpMessage
request
)。XML文档只能有一个根元素。您应该在与
标题
元素相同的级别上构造
请求
元素。对此感到抱歉。我想这是一个简单的错误。在错误的位置关闭括号。谢谢
XElement root = doc.Element("pfpMessage");
root.SetAttributeValue("version", 1.5);
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)
                    )
                )
            )
        )
    )
);