XMLElement仅包含第一个子节点

时间:2014-08-08 15:42:53

标签: c# xml wcf

我有一个WCF服务,它获取发送的XML文件,其中节点可以变化,尽管根元素总是相同的。有些文件可能如下所示:

<MyXML xmlns="something">
  <xmlDoc>
    <element1>Value</element1>
    <element2>Value</element2>
  </xmlDoc>
</MyXML> 

虽然其他人看起来像这样

<MyXML xmlns="something">
  <xmlDoc>
    <otherelement1>Value</otherelement1>
    <child1>
       <element3>Value</element3>
       <element2>Value</element2>
     </child1>
  </xmlDoc>
</MyXML> 

因为我无法知道它们的外观,我想要做的只是抓住整个元素然后解析它,但是现在我只能得到第一个子元素(element1)。我的服务界面如下所示:

[ServiceContract]
public interface IRestServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "POST",
        ResponseFormat = WebMessageFormat.Xml,
        RequestFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "auth")]
    ResponseData Auth(MyXML rData);
}

我的datacontract看起来像这样:

[DataContract(Namespace = "something")]
public class MyXML
{
    [DataMember]
    public XmlElement xmlDoc { get; set; }
}

但在我的服务中,我只是从XML获得第一个元素 - 即

<element1>Value</element1>

所以我的问题是,这会有效吗?我需要改变什么?我尝试将数据合同作为List而不是

[DataContract(Namespace = "something")]
public class MyXML
{
    [DataMember]
    public List<XmlElement> xmlDoc { get; set; }
}

但是刚刚返回一个空列表。我是WCF的新手,所以如果需要任何其他细节,请告诉我。

2 个答案:

答案 0 :(得分:0)

好的,事实证明这真的很容易解决 - 我实际上是从Android应用程序编写XML,所以我有幸改变结构。我只是添加了一个内部节点,所以我的XML来自这个

<MyXML xmlns="something">
<xmlDoc>
 <otherelement1>Value</otherelement1>
   <child1>
     <element3>Value</element3>
     <element2>Value</element2>
   </child1>
 </xmlDoc>

到此:

<MyXML xmlns="something">
<xmlDoc>
 <xmlDocInner>
  <otherelement1>Value</otherelement1>
    <child1>
      <element3>Value</element3>
      <element2>Value</element2>
    </child1>
  </xmlDocInner>
 </xmlDoc>

现在,当我获得xmlDoc元素时,我将所有内容都放在xmlDocInner节点中。如果没有内部节点作为缓冲区,它仍然会引出如何获取整个元素的问题,但我对此感到满意。

答案 1 :(得分:0)

要访问原始XML,use the Message class,而不是DataContract。如果你想让POCO帮助你,你可能会被XmlSerializer困住。

static class SchemaConstants
{
    public const string Namespace = "something";
}

[XmlType(Namespace = SchemaConstants.Namespace)]
[XmlRoot(Namespace = SchemaConstants.Namespace)]
public class xmlDoc 
{
    // case 1
    public string element1;
    public string element2;

    // case 2
    public string otherelement1;
    public child1 child1;
}

[XmlType(Namespace = SchemaConstants.Namespace)]
public class child1
{
    public string element3;
    public string element2;
}

任何不存在的成员都将被反序列化为null。您必须mark your contract or service implementation with the [XmlSerializerFormat] attribute

第一个例子的结果:

picture of visual studio watch window showing element1 and 2 with values, and all others null

第二个例子的结果:

picture of visual studio watch window showing element1 and 2 null, and all others with a value

您还可以使用实现IXmlSerializer接口的类型并自行处理反序列化。