【问题标题】:How to convert byte array to xml?如何将字节数组转换为xml?
【发布时间】:2023-03-27 12:30:02
【问题描述】:

我有一个这样的字节流:

byte[] response =
        {
            69, 90, 69, 45, 88, 77, 76, 45, 77, 115, 103, 48, 50, 60, 77, 101, 115, 115, 97, 103, 101, 62, 13, 10, 32,
            32, 60, 72, 101, 97, 100, 101, 114, 62, 13, 10, 32, 32, 32, 32, 60, 77, 101, 115, 115, 97, 103, 101, 68,
            97, 116, 101, 62, 50, 48, 49, 48, 48, 51, 50, 52, 60, 47, 77, 101, 115, 115, 97, 103, 101, 68, 97, 116,
            101, 62, 13, 10, 32, 32, 32, 32, 60, 77, 101, 115, 115, 97, 103, 101, 84, 105, 109, 101, 62, 49, 57, 50,
            56, 48, 54, 60, 47, 77, 101, 115, 115, 97, 103, 101, 84, 105, 109, 101, 62, 13, 10, 32, 32, 60, 47, 72,
            101, 97, 100, 101, 114, 62, 13, 10, 32, 32, 60, 66, 111, 100, 121, 62, 13, 10, 32, 32, 32, 32, 60, 84,
            114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 73, 68, 62, 51, 51, 50, 53, 50, 55, 60, 47, 84, 114, 97,
            110, 115, 97, 99, 116, 105, 111, 110, 73, 68, 62, 13, 10, 32, 32, 32, 32, 60, 84, 114, 97, 110, 115, 97,
            99, 116, 105, 111, 110, 78, 117, 109, 98, 101, 114, 62, 49, 50, 49, 48, 52, 55, 48, 60, 47, 84, 114, 97,
            110, 115, 97, 99, 116, 105, 111, 110, 78, 117, 109, 98, 101, 114, 62, 13, 10, 32, 32, 32, 32, 60, 80,
            104, 111, 110, 101, 78, 117, 109, 98, 101, 114, 62, 54, 51, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 60,
            47, 80, 104, 111, 110, 101, 78, 117, 109, 98, 101, 114, 62, 13, 10, 32, 32, 32, 32, 60, 65, 109, 111,
            117, 110, 116, 62, 48, 48, 48, 48, 48, 48, 50, 53, 48, 48, 60, 47, 65, 109, 111, 117, 110, 116, 62, 13,
            10, 32, 32, 32, 32, 60, 82, 101, 115, 117, 108, 116, 62, 48, 51, 60, 47, 82, 101, 115, 117, 108, 116, 62,
            13, 10, 32, 32, 60, 47, 66, 111, 100, 121, 62, 13, 10, 60, 47, 77, 101, 115, 115, 97, 103, 101, 62
        };

我想从中提取 xml。尝试了以下方法:

XmlDocument doc2 = new XmlDocument();
        MemoryStream ms = new MemoryStream(response);
        doc2.Load(ms);

但有一个例外:

System.Xml.dll 中出现“System.Xml.XmlException”类型的未处理异常

附加信息:根级别的数据无效。第 1 行,位置 1。

我对这个 xml 东西真的很陌生,doc2.load() 方法应该做什么?它会创建我以后可以读取的任何 xml 文件,它只是一个内存集合吗?

【问题讨论】:

    标签: c# xml xml-parsing xmlhttprequest


    【解决方案1】:

    问题在于您的 byte [] 数组表示一个开头有一些非 XML 字符的字符串。如果我这样做了

    string s;
    using (var ms = new MemoryStream(response))
    using (var reader = new StreamReader(ms))
    {
        s = reader.ReadToEnd();
    
        Console.WriteLine(s);
    }
    

    我明白了

    EZE-XML-Msg02<Message>
      <Header>
        <MessageDate>20100324</MessageDate>
        <MessageTime>192806</MessageTime>
      </Header>
      <Body>
        <TransactionID>332527</TransactionID>
        <TransactionNumber>1210470</TransactionNumber>
        <PhoneNumber>639999999999</PhoneNumber>
        <Amount>0000002500</Amount>
        <Result>03</Result>
      </Body>
    </Message>
    

    必须先删除EZE-XML-Msg02。最好的方法是首先不要将它存储在 XML 中。但如果你无法阻止它被包含在 XML 中,你可以这样做:

    XmlDocument doc2 = new XmlDocument();
    using (var ms = new MemoryStream(response))
    using (var reader = new StreamReader(ms))
    {
        while (!reader.EndOfStream && reader.Peek() > -1 && (char)reader.Peek() != '<')
            reader.Read();
        if (!reader.EndOfStream)
            doc2.Load(reader);
    }
    

    【讨论】:

      【解决方案2】:

      那是因为它无效的 XML。您的完整字符串如下:

      EZE-XML-Msg02<Message>
        <Header>
          <MessageDate>20100324</MessageDate>
          <MessageTime>192806</MessageTime>
        </Header>
        <Body>
          <TransactionID>332527</TransactionID>
          <TransactionNumber>1210470</TransactionNumber>
          <PhoneNumber>639999999999</PhoneNumber>
          <Amount>0000002500</Amount>
          <Result>03</Result>
        </Body>
      </Message>
      

      无关的“EZE-XML-Msg02”导致了问题。你要么想修剪这部分(如果你知道这将是提前的长度,你可以做 string.Remove 或 string.Split(',') 并使用它来查找长度,如果你不知道)。或者,更好的是,如果可能的话,首先阻止它进入 XML。

      这里有一些旁注。首先,您的解码方法肯定会起作用,但您可能希望将 MemoryStream 放在“使用”块中。另一种解码方式如下:

      string str = ASCIIEncoding.ASCII.GetString(response);
      

      它会为你解码字符串。你可以这样做

      doc2.LoadXml(str);
      

      它会为你加载文档。

      此时,XmlDocument 对象本身只是一个内存中的集合。如果您愿意,可以通过调用 doc2.Save(filename) 将其显式保存为文件。

      另请注意,有些人更喜欢 LINQ 版本 (XDocument) 而不是 XML 文档,因此他们可以针对它运行 LINQ 查询。 XmlDocument 对象支持 XPath 查询,但这有点低效,因为它不能静态编译查询,必须在运行时对其进行解析。不过,您使用哪一种实际上取决于您的具体应用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        相关资源
        最近更新 更多