C# ';:';导致{“XML文档(2,6)中存在错误”的符号
Xml读取问题C# ';:';导致{“XML文档(2,6)中存在错误”的符号,c#,xml,C#,Xml,Xml读取问题 private DataPDU Deserialize(string filepath) { XmlSerializer deserializer = new XmlSerializer(typeof(DataPDU)); UTF8Encoding utf8 = new UTF8Encoding(true); StreamReader reader = new StreamReader(filepath, utf8);
private DataPDU Deserialize(string filepath)
{
XmlSerializer deserializer = new XmlSerializer(typeof(DataPDU));
UTF8Encoding utf8 = new UTF8Encoding(true);
StreamReader reader = new StreamReader(filepath, utf8);
object obj = deserializer.Deserialize(reader); //error raising here
DataPDU XmlData = (DataPDU)obj;
reader.Close();
return XmlData;
}
如果我从标记中删除“Saa:”,我的代码工作正常。但是文件提供者以上述格式提供文件。你能帮忙吗。下面是错误跟踪的一部分
System.InvalidOperationException was unhandled
HResult=-2146233079
Message=There is an error in XML document (2, 6).
Source=System.Xml
StackTrace:
Message=<DataPDU xmlns='urn:swift:saa:xsd:saa.2.0'> was not expected.
Source=Microsoft.GeneratedCode
StackTrace:
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataPDU.Read9_DataPDU()
InnerException:
System.InvalidOperationException未处理
HResult=-2146233079
Message=XML文档中存在错误(2,6)。
Source=System.Xml
堆栈跟踪:
Message=不是预期的。
Source=Microsoft.GeneratedCode
堆栈跟踪:
在Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataPDU.Read9_DataPDU()中
内部异常:
xml文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<Saa:DataPDU xmlns:Saa="urn:swift:saa:xsd:saa.2.0" xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:SwGbl="urn:swift:snl:ns.SwGbl" xmlns:SwInt="urn:swift:snl:ns.SwInt" xmlns:SwSec="urn:swift:snl:ns.SwSec">
<Saa:Body>
<AppHdr:AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xmlns:AppHdr="urn:iso:std:iso:20022:tech:xsd:head.001.001.01">
<Fr>
<FIId>
<FinInstnId>
<BICFI>ABBLBDDH</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>BBHOBDDHRTG</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>MRQ140527142125236</BizMsgIdr>
<MsgDefIdr>pacs.008.001.04</MsgDefIdr>
<BizSvc>RTGS_CSCT</BizSvc>
<CreDt>2014-05-27T14:21:25</CreDt>
</AppHdr:AppHdr>
</Saa:Body>
</Saa:DataPDU>
abblbdh
BBHOBDHRTG
MRQ140527142125236
pacs.008.001.04
RTGS\U CSCT
2014-05-27T14:21:25
上周我用同样的解决方案帮助了某人。使用正则表达式删除名称空间
public DataPDU Deserialize(string filepath)
{
XmlSerializer deserializer = new XmlSerializer(typeof(DataPDU));
UTF8Encoding utf8 = new UTF8Encoding(true);
StreamReader reader = new StreamReader(filepath, utf8);
string text = reader.ReadToEnd();
string pattern = "(</?)(\\w+:)";
string fixedText = Regex.Replace(text,pattern,"$1");
StringReader fixedReader = new StringReader(fixedText);
object obj = deserializer.Deserialize(fixedReader); //error raising here
DataPDU XmlData = (DataPDU)obj;
reader.Close();
return XmlData;
}
公共数据PDU反序列化(字符串文件路径)
{
XmlSerializer反序列化器=新的XmlSerializer(typeof(DataPDU));
UTF8Encoding utf8=新的UTF8Encoding(真);
StreamReader=新的StreamReader(文件路径,utf8);
string text=reader.ReadToEnd();
string pattern=“(包括XML序列化属性在内的
DataPDU
的定义是什么?你有这些属性中的名称空间吗?我真是个傻瓜……:(…非常感谢,先生…@RichardPlease添加此作为答案-显示固定类型-因此其他寻求此解决方案的人在将来会有帮助。破解XML结构不是一个解决方案。这是一个解决方案,应该保留用于极少数情况下,当您的XML解析器非常原始,不支持名称空间时。这不适用于.NET的XML支持。我不同意这是一种黑客行为。如果您从供应商处获得一个名称空间为Net无法处理的文件,这可能是唯一的选择。这不是黑客行为,这里的文件格式是由金融交易网络定义的,因此开发人员无法修改。今天仍然是一个问题。