【问题标题】:How to Deserialize a XML response when the root node is a string in C#当根节点是C#中的字符串时如何反序列化XML响应
【发布时间】:2016-11-09 10:21:13
【问题描述】:

Microsoft Cognitive Text Translator API 以以下格式给出响应:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">nl</string>

我试图用下面的代码反序列化它:

var serializer = new XmlSerializer(typeof(string));
var stringReader = new StringReader(xmlResult); // xmlResult is the xml string above
var textReader = new XmlTextReader(stringReader);
var result = serializer.Deserialize(textReader) as string;

但这会导致异常:

System.InvalidOperationException:XML 文档中存在错误 (1, 23)。 ---> System.InvalidOperationException: 不是预期的。

我正在考虑将 api 响应 xml 包装在另一个根节点中,这样我就可以将它解析为一个对象。但是必须有更好的方法来解决这个问题。

【问题讨论】:

  • 你想从字符串中获取nl吗?
  • @WiktorStribiżew 是的,只是nl 部分
  • 试试var result = XElement.Parse(xmlResult).Value;

标签: c# .net xml string root-node


【解决方案1】:

Microsoft Cognitive Text Translator API 以以下格式给出响应

考虑到它始终是具有单个字符串节点的有效 XML 片段,您可以安全地使用

var result = XElement.Parse(xmlResult).Value;

使用XElement.Parse 解析XML 字符串时,您不必关心命名空间。

【讨论】:

  • @Charles Mager 的答案也是正确的,但我更喜欢这个答案,因为它是单行代码。
【解决方案2】:

您遇到的问题是命名空间。如果您使用该序列化程序序列化一个值,您会得到:

<string>nl</string>

所以将默认命名空间设置为 XML 中的命名空间:

var serializer = new XmlSerializer(typeof(string),
     "http://schemas.microsoft.com/2003/10/Serialization/");

然后使用它:

using (var reader = new StringReader(xmlResult))
{
    var result = (string)serializer.Deserialize(reader);
}

请参阅this fiddle 以获得工作演示。

【讨论】:

  • 我一直在寻找 defaultNamespace 属性,但 Intellisense 直到我输入一个字符串才显示它。感谢您的解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多