Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';:';导致{“XML文档(2,6)中存在错误”的符号_C#_Xml - Fatal编程技术网

C# ';:';导致{“XML文档(2,6)中存在错误”的符号

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);

Xml读取问题

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无法处理的文件,这可能是唯一的选择。这不是黑客行为,这里的文件格式是由金融交易网络定义的,因此开发人员无法修改。今天仍然是一个问题。