2014-08-29 89 views
2

我想创建一个XML,它将发送一个请求到第三方站点来创建会议参加者。如何在XML中控制名称空间前缀?

的文档是:https://developer.cisco.com/media/webex-xml-api/121CreateMeetingAttendee.html

给出有实例显示请求XML应该在这个格式:

<?xml version="1.0"?> 
<serv:message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <header> 
     <securityContext> 
      <webExID>hostid</webExID> 
      <password>hostpassword</password> 
      <siteID>0000</siteID> 
      <partnerID>9999</partnerID> 
      <email>[email protected]</email> 
     </securityContext> 
    </header> 
    <body> 
     <bodyContent xsi:type= 
      "java:com.webex.service.binding.attendee.CreateMeetingAttendee"> 
      <person> 
       <name>alterhost</name> 
       <address> 
        <addressType>PERSONAL</addressType> 
       </address> 
       <email>[email protected]</email> 
       <type>MEMBER</type> 
      </person> 
      <role>HOST</role> 
      <sessionKey>808961063</sessionKey> 
     </bodyContent> 
    </body> 
</serv:message> 

直到现在我都试过:

XNamespace aw = "http://www.w3.org/2001/XMLSchema-instance"; 
      XNamespace xsi = "java:com.tempService"; 

      XElement root = new XElement(aw + "message", 
       new XAttribute(XNamespace.Xmlns + "serv", aw), 
       new XElement("header", 
        new XElement("securityContext", new XElement("siteID", "123"), 
         new XElement("partnerID", "111"))), 

       new XElement("body", new XElement("bodyContent", 
        new XAttribute("xsitype", xsi), 
        new XElement("person", new XElement("name", "sample content"), 
         new XElement("email", "[email protected]")), 
        new XElement("sessionKey", "###")))); 

它的结果以下XML:

<serv:message xmlns:serv="http://www.w3.org/2001/XMLSchema-instance"> 
    <header> 
    <securityContext> 
     <siteID>123</siteID> 
     <partnerID>111</partnerID> 
    </securityContext> 
    </header> 
    <body> 
    <bodyContent xsitype="java:com.tempService"> 
     <person> 
     <name>sample content</name> 
     <email>[email protected]</email> 
     </person> 
     <sessionKey>###</sessionKey> 
    </bodyContent> 
    </body> 
</serv:message> 

正如您所看到的,它与请求XML格式不匹配。

问题:

  1. 从顶部<?xml version="1.0"?>丢失。
  2. <serv:message xmlns:serv=...应该<serv:message xmlns:xsi=...
  3. <bodyContent xsitype="...">应该<bodyContent xsi:type="...">

我已经通过了http://msdn.microsoft.com/en-us/library/bb387075.aspx,但不能纠正。

任何人都可以帮助我解决这个问题。任何帮助,高度赞赏。

+2

您显示为“示例XML”的文本不是有效的XML(具有未定义的前缀“serv:”)。您将无法使用生成像XDocument这样的有效XML的类型来构造这样的文本。 – 2014-08-29 06:00:21

+0

你是如何编写XML的? – Mrchief 2014-08-29 06:19:43

+0

@AlexeiLevenkov是的,你是对的。我认为''会工作吗? – 2014-08-29 06:31:33

回答

1
  1. 您需要使用XDeclaration对象

  2. 添加另一个XAttributexmlns:xsi类似于你做了什么xmlns:serv

  3. 使用xsi变量与字符串"type"追加到生产xsi:type属性

完整的示例(从您发布的代码修改):

XNamespace aw = "http://www.w3.org/2001/XMLSchema-instance"; 
XNamespace xsi = "java:com.tempService"; 

XElement root = new XElement(aw + "message", 
    new XAttribute(XNamespace.Xmlns + "serv", aw), 
    new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName), 
    new XElement("header", 
     new XElement("securityContext", new XElement("siteID", "123"), 
      new XElement("partnerID", "111"))), 

    new XElement("body", new XElement("bodyContent", 
     new XAttribute(xsi + "type", "java:com.webex.service.binding.attendee.CreateMeetingAttendee"), 
     new XElement("person", new XElement("name", "sample content"), 
      new XElement("email", "[email protected]")), 
     new XElement("sessionKey", "###")))); 
//use XDocument with XDeclaration to produce XML including xml declaration line : 
var doc = new XDocument(new XDeclaration("1.0", null, null), root); 
Console.WriteLine(doc.Declaration + Environment.NewLine + doc.ToString()); 

控制台输出:

<?xml version="1.0"?> 
<serv:message xmlns:serv="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi=" 
    java:com.tempService"> 
    <header> 
     <securityContext> 
     <siteID>123</siteID> 
     <partnerID>111</partnerID> 
     </securityContext> 
    </header> 
    <body> 
     <bodyContent xsi:type="java:com.webex.service.binding.attendee.CreateMeeting 
     Attendee"> 
     <person> 
      <name>sample content</name> 
      <email>[email protected]</email> 
     </person> 
     <sessionKey>###</sessionKey> 
     </bodyContent> 
    </body> 
</serv:message> 

PS:XDocument.ToString()不打印XML报关行,但XDocument.Save()包括保存XML声明行文件。与此相关的主题:XDocument.ToString() drops XML Encoding Tag