当根节点是 C# 中的字符串时如何反序列化 XML 响应
How to Deserialize a XML response when the root node is a string in C#
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: There is an error in XML document (1, 23). ---> System.InvalidOperationException: was not expected.
我正在考虑将 api 响应 xml 包装在另一个根节点中,这样我就可以将它解析为一个对象。但是必须有更好的方法来解决这个问题。
您遇到的问题是名称空间。如果您使用该序列化器序列化一个值,您将得到:
<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。
The Microsoft Cognitive Text Translator API gives a response in the following format
考虑到它始终是有效的 XML 具有单个字符串节点的片段,您可以安全地使用
var result = XElement.Parse(xmlResult).Value;
用XElement.Parse
解析XML字符串时,不必关心命名空间。
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: There is an error in XML document (1, 23). ---> System.InvalidOperationException: was not expected.
我正在考虑将 api 响应 xml 包装在另一个根节点中,这样我就可以将它解析为一个对象。但是必须有更好的方法来解决这个问题。
您遇到的问题是名称空间。如果您使用该序列化器序列化一个值,您将得到:
<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。
The Microsoft Cognitive Text Translator API gives a response in the following format
考虑到它始终是有效的 XML 具有单个字符串节点的片段,您可以安全地使用
var result = XElement.Parse(xmlResult).Value;
用XElement.Parse
解析XML字符串时,不必关心命名空间。