2016-07-25 251 views
0

我有一个字节流是这样的:如何将字节数组转换为xml?

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.XmlException”未处理的异常发生在system.xml.dll的

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

我真的很新这个XML的东西,什么应该doc2.load()方法呢?它会创建任何XML文件,我可以稍后阅读,它会只是一个内存集合?

回答

2

问题是您的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放在“using”块中。解码的另一种方式如下:

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

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

doc2.LoadXml(str); 

它会为你加载文档。

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

另请注意,有些人更喜欢LINQ版本(XDocument)到XML文档,以便他们可以运行LINQ查询。 XmlDocument对象支持XPath查询,但效率不高,因为它无法静态编译查询,必须在运行时解析。尽管如此,你使用的是真的取决于你的具体应用。