【发布时间】:2020-01-15 22:51:15
【问题描述】:
我正在使用 StringReader 读取 xml 流,然后我想将该流作为 XML 读取以对其进行序列化和反序列化。 尽管由于某种原因它工作正常,但我的 XmlReader 变量返回 null。 我看到的 XML 和以前一样。
我的代码是:
StringReader stringReader = new StringReader(result);
stringReader.ReadLine();//omit the first line that contains xml encoding
XmlReader xmlReader = XmlReader.Create(stringReader);
XmlSerializer XmlSerializer = new XmlSerializer(typeof(ResponseDoc));
ResponseDoc XmlResponseDoc = (ResponseDoc)XmlSerializer.Deserialize(xmlReader);
结果viariable的XML格式是
<?xml version="1.0" encoding="utf-8"?>
<ResponseDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<response>
<entitylineNumber>1</entitylineNumber>
<statusCode>Success</statusCode>
<entityUid>0BA0C06E9CBAA3D890D025A37A577DDB074BA9A9</entityUid>
<entityMark>1000000115468</entityMark>
</response>
</ResponseDoc>
我的 xmlReader 变量为空。我还尝试删除 stringReader.ReadLine();但它没有改变任何东西。 我之所以使用它,是因为如果存在编码行,则无法对其进行序列化。
ResponseDoc 类:
#region XSD Schema
[XmlRoot(ElementName = "Responses", Namespace = "")]
public partial class ResponseDoc
{
private ResponseType[] responseField;
/// <remarks/>
[System.Xml.Serialization.XmlElement(ElementName = "Response", Namespace = "")]
public ResponseType[] response
{
get
{
return this.responseField;
}
set
{
this.responseField = value;
}
}
}
[XmlRoot(ElementName = "Response", Namespace = "")]
public partial class ResponseType
{
private int entitylineNumberField;
private string statusCodeField;
private string uid;
private string markUid;
private ResponseTypeErrors[] responseTypeErrors;
/// <remarks/>
[XmlElement(ElementName = "inv_number", Namespace = "")]
public string entitylineNumber
{
get
{
return this.entitylineNumberField.ToString();
}
set
{
this.entitylineNumberField = int.Parse(value);
}
}
/// <remarks/>
[XmlElement(ElementName = "StatusCode", Namespace = "")]
public string statusCode
{
get
{
return this.statusCodeField;
}
set
{
this.statusCodeField = value;
}
}
[XmlElement(ElementName = "Uid", Namespace = "")]
public string Uid
{
get
{
return this.uid;
}
set
{
this.uid = value;
}
}
[XmlElement(ElementName = "Mark", Namespace = "")]
public string Mark
{
get
{
return this.markUid;
}
set
{
this.markUid = value;
}
}
[XmlElement(ElementName = "Errors", Namespace = "")]
public ResponseTypeErrors[] Errors
{
get
{
return this.responseTypeErrors;
}
set
{
this.responseTypeErrors = value;
}
}
}
[XmlRoot(ElementName = "Errors", Namespace = "")]
public partial class ResponseTypeErrors
{
private ErrorType[] errorField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Error")]
public ErrorType[] error
{
get
{
return this.errorField;
}
set
{
this.errorField = value;
}
}
}
[XmlRoot(ElementName = "Error", Namespace = "")]
public partial class ErrorType
{
private string messageField;
private int codeField;
/// <remarks/>
[XmlElement(ElementName = "Message", Namespace = "")]
public string message
{
get
{
return this.messageField;
}
set
{
this.messageField = value;
}
}
/// <remarks/>
[XmlElement(ElementName = "Code", Namespace = "")]
public int code
{
get
{
return this.codeField;
}
set
{
this.codeField = value;
}
}
}
#endregion
更新: 我看到你们所有人都给了我关于我的 XSD 架构的答案。 问题不在于反序列化 XML。 我的问题是
中的变量 xmlReaderXmlReader xmlReader = XmlReader.Create(stringReader);
is {None} 尽管我在结果变量中有 xml 答案并将其传递给 stringReader。 我不明白为什么有些人在我的问题中给我否定。我相信很清楚我的问题是什么,并且我确信我提供了有关我的代码的足够信息。如果我知道更多,我会自己解决。 我也用 strinReader 和 xmlReader 上传了截图
【问题讨论】:
-
您是否尝试针对某些在线 XML 验证器验证该 XML?这似乎不正确
-
@Steve 我无法更改 XML 。它来自外部服务作为答案
-
如果塞进单个XML文件中是无效的。您确定没有将两个或多个 XML 连接在一起吗?注意你怎么有两个 这在 XML 规范中是不允许的。你只能有一个,而且只能在文件的开头
-
您的 XML 没有根,解决方法是将服务响应包装在根元素中。例如
<ResponseRoot></ResponseRoot> -
@Steve 对不起,你是对的。我粘贴了两次相同的 XML。我编辑我的问题
标签: c# xml xmlreader stringreader