【问题标题】:illegal characters in path while Deserialise xml?反序列化xml时路径中的非法字符?
【发布时间】:2014-07-10 14:53:40
【问题描述】:

我有一个 xml,我需要反序列化为列表。实际上我只是使用 XSD2Code 工具来生成序列化和反序列化方法。

一切正常,但是当我传递文件名时,我得到了 xmlstring 但没有反序列化,因为 路径中有非法字符

我的代码:

    public  T LoadFromFile(string fileName)
    {
        System.IO.FileStream file = null;
        System.IO.StreamReader sr = null;
        try
        {
            file = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read);
            sr = new System.IO.StreamReader(file);
            string xmlString = sr.ReadToEnd();
            sr.Close();
            file.Close();

            return Deserialize(xmlString);
        }
        finally
        {
            if ((file != null))
            {
                file.Dispose();
            }
            if ((sr != null))
            {
                sr.Dispose();
            }
        }
    }

这里我得到了 xmlString,我得到的字符串是 ...

"<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<ZTIMES_SQL_TO_SAP_CELL.Response xmlns=\"urn:sap-com:document:sap:rfc:functions\">\r\n  <IT_RETURN xmlns=\"\">\r\n    <item>\r\n      <INAME>CELLCOMPLETION</INAME>\r\n      <UNQ_ID>1234</UNQ_ID>\r\n      <STATUS>F</STATUS>\r\n    </item>\r\n    <item>\r\n      <INAME>CELLCOMPLETION</INAME>\r\n      <UNQ_ID>1235</UNQ_ID>\r\n      <STATUS>S</STATUS>\r\n    </item>\r\n    <item>\r\n      <INAME>CELLCOMPLETION</INAME>\r\n      <UNQ_ID>1236</UNQ_ID>\r\n      <STATUS>F</STATUS>\r\n    </item>\r\n  </IT_RETURN>\r\n  <IT_CELL_COMP xmlns=\"\">\r\n    <item>\r\n      <UNQ_ID>1234</UNQ_ID>\r\n      <LOC_CODE>LOC1</LOC_CODE>\r\n      <TRSLNO>TRSLNO1</TRSLNO>\r\n      <MODEL>MODEL1</MODEL>\r\n      <CELL>CELL1</CELL>\r\n      <CDATE>1900-01-01</CDATE>\r\n      <COMP_STATUS>COMP_STAT1</COMP_STATUS>\r\n      <NEQUNR>NEQUNR1</NEQUNR>\r\n      <SHIFT>1</SHIFT>\r\n      <ITERATION>1</ITERATION>\r\n      <CREATED_BY>CREATED_BY1</CREATED_BY>\r\n      <CREATED_DT>1900-01-01</CREATED_DT>\r\n      <CREATED_TM>01:01:01</CREATED_TM>\r\n    </item>\r\n    <item>\r\n      <UNQ_ID>1235</UNQ_ID>\r\n      <LOC_CODE>LOC2</LOC_CODE>\r\n      <TRSLNO>TRSLNO2</TRSLNO>\r\n      <MODEL>MODEL2</MODEL>\r\n      <CELL>CELL2</CELL>\r\n      <CDATE>1900-01-01</CDATE>\r\n      <COMP_STATUS>COMP_STAT2</COMP_STATUS>\r\n      <NEQUNR>NEQUNR2</NEQUNR>\r\n      <SHIFT>-79228162514264337593543950335</SHIFT>\r\n      <ITERATION>-79228162514264337593543950335</ITERATION>\r\n      <CREATED_BY>CREATED_BY2</CREATED_BY>\r\n      <CREATED_DT>1900-01-01</CREATED_DT>\r\n      <CREATED_TM>01:01:01</CREATED_TM>\r\n    </item>\r\n    <item>\r\n      <UNQ_ID>1236</UNQ_ID>\r\n      <LOC_CODE>LOC3</LOC_CODE>\r\n      <TRSLNO>TRSLNO3</TRSLNO>\r\n      <MODEL>MODEL3</MODEL>\r\n      <CELL>CELL3</CELL>\r\n      <CDATE>0001-01-01</CDATE>\r\n      <COMP_STATUS>COMP_STAT3</COMP_STATUS>\r\n      <NEQUNR>NEQUNR3</NEQUNR>\r\n      <SHIFT>79228162514264337593543950335</SHIFT>\r\n      <ITERATION>79228162514264337593543950335</ITERATION>\r\n      <CREATED_BY>CREATED_BY3</CREATED_BY>\r\n      <CREATED_DT>1900-01-01</CREATED_DT>\r\n      <CREATED_TM>01:01:01</CREATED_TM>\r\n    </item>\r\n  </IT_CELL_COMP>\r\n</ZTIMES_SQL_TO_SAP_CELL.Response>"

我的原始xml文件是

<?xml version="1.0" encoding="utf-8"?>
<ZTIMES_SQL_TO_SAP_CELL.Response xmlns="urn:sap-com:document:sap:rfc:functions">
  <IT_RETURN xmlns="">
    <item>
      <INAME>CELLCOMPLETION</INAME>
      <UNQ_ID>1234</UNQ_ID>
      <STATUS>F</STATUS>
    </item>
    <item>
      <INAME>CELLCOMPLETION</INAME>
      <UNQ_ID>1235</UNQ_ID>
      <STATUS>S</STATUS>
    </item>
    <item>
      <INAME>CELLCOMPLETION</INAME>
      <UNQ_ID>1236</UNQ_ID>
      <STATUS>F</STATUS>
    </item>
  </IT_RETURN>
  <IT_CELL_COMP xmlns="">
    <item>
      <UNQ_ID>1234</UNQ_ID>
      <LOC_CODE>LOC1</LOC_CODE>
      <TRSLNO>TRSLNO1</TRSLNO>
      <MODEL>MODEL1</MODEL>
      <CELL>CELL1</CELL>
      <CDATE>1900-01-01</CDATE>
      <COMP_STATUS>COMP_STAT1</COMP_STATUS>
      <NEQUNR>NEQUNR1</NEQUNR>
      <SHIFT>1</SHIFT>
      <ITERATION>1</ITERATION>
      <CREATED_BY>CREATED_BY1</CREATED_BY>
      <CREATED_DT>1900-01-01</CREATED_DT>
      <CREATED_TM>01:01:01</CREATED_TM>
    </item>
    <item>
      <UNQ_ID>1235</UNQ_ID>
      <LOC_CODE>LOC2</LOC_CODE>
      <TRSLNO>TRSLNO2</TRSLNO>
      <MODEL>MODEL2</MODEL>
      <CELL>CELL2</CELL>
      <CDATE>1900-01-01</CDATE>
      <COMP_STATUS>COMP_STAT2</COMP_STATUS>
      <NEQUNR>NEQUNR2</NEQUNR>
      <SHIFT>-79228162514264337593543950335</SHIFT>
      <ITERATION>-79228162514264337593543950335</ITERATION>
      <CREATED_BY>CREATED_BY2</CREATED_BY>
      <CREATED_DT>1900-01-01</CREATED_DT>
      <CREATED_TM>01:01:01</CREATED_TM>
    </item>
    <item>
      <UNQ_ID>1236</UNQ_ID>
      <LOC_CODE>LOC3</LOC_CODE>
      <TRSLNO>TRSLNO3</TRSLNO>
      <MODEL>MODEL3</MODEL>
      <CELL>CELL3</CELL>
      <CDATE>0001-01-01</CDATE>
      <COMP_STATUS>COMP_STAT3</COMP_STATUS>
      <NEQUNR>NEQUNR3</NEQUNR>
      <SHIFT>79228162514264337593543950335</SHIFT>
      <ITERATION>79228162514264337593543950335</ITERATION>
      <CREATED_BY>CREATED_BY3</CREATED_BY>
      <CREATED_DT>1900-01-01</CREATED_DT>
      <CREATED_TM>01:01:01</CREATED_TM>
    </item>
  </IT_CELL_COMP>
</ZTIMES_SQL_TO_SAP_CELL.Response>

请帮我找出错误

更新: 新增反序列化方法

public  T Deserialize(string xml)
{
   // System.IO.StringReader stringReader = null;
    StreamReader stream = null;
    try
    {
        Serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

        stream = new StreamReader(xml);

       // stringReader = new System.IO.StringReader(xml);
        return ((T)(Serializer.Deserialize(System.Xml.XmlReader.Create(stream))));
    }
    finally
    {
        if ((stream != null))
        {
            stream.Dispose();
        }
    }
}

【问题讨论】:

  • 那么您的反序列化方法是什么样的?请注意,您的代码是编写File.ReadAllText(fileName) 的冗长方式 - 您应该使用using 语句来避免所有手动处理。您的if 条件中也不需要那么多括号。
  • 我删除了所有代码并简单地添加了 string xmlString = File.ReadAllText(fileName);但我还是遇到了同样的错误。
  • 嗯,是的,你会的。这就是我的观点——这是做同样事情的一种更简单的方法。但问题可能出在您的Deserialize 方法中,您没有向我们展示。
  • 我添加了反序列化方法

标签: c# xml


【解决方案1】:

好的,现在我们已经有了你的Deserialize 方法,问题很明显:

stream = new StreamReader(xml);

这将xml 视为文件名,而不是XML。要么你应该有:

public T Deserialize(string filename)
{
    // There's no need to make the serializer a property or instance variable...
    var serializer = new XmlSerializer(typeof(T));
    using (var stream = File.OpenRead(filename))
    {
        return (T) serializer.Deserialize(stream);
    }
}

... 使其采用 XML,并使用 StringReader:

public T Deserialize(string xml)
{
    var serializer = new XmlSerializer(typeof(T));
    return (T) serializer.Deserialize(new StringReader(xml));
}

我个人更喜欢前一个版本 - 它允许 XML 解析代码自动检测编码,而目前当您将文件作为字符串读取时,您假设 UTF-8。

【讨论】:

  • StringReader 实现了IDisposable,所以你应该释放实例。
  • @Gene:不,在这种情况下没有必要——它只实现了IDisposable,因为TextReader 实现了。没有要释放的非托管资源。添加using 语句不会对执行时间造成任何危害,但代码会更加冗长而无益。
  • 谢谢朋友。我对其他逻辑感到困惑。
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
相关资源
最近更新 更多