2016-07-25 2 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

Дополнительная информация: Данные на root недопустим. Строка 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

Это потому, что он is недействительный 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> 

посторонний «ЭЗ-XML-Msg02» вызывает проблему. Вы либо хотите обрезать эту часть (вы можете сделать string.Remove, если знаете длину, что это будет заранее, или string.Split (',') и используйте это, чтобы найти длину, если вы этого не сделаете). Или, еще лучше, прекратите его, если это возможно, входить в XML.

Несколько примечаний стороны на этом этапе. Во-первых, ваш метод декодирования определенно будет работать, но вы, вероятно, захотите поместить MemoryStream внутри блока «using». Другим способом выполнения декодирования является следующее:

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

он расшифрует строку для вас. Вы можете сделать

doc2.LoadXml(str); 

и он загрузит документ для вас.

Сам объект XmlDocument будет представлять собой коллекцию в памяти. Вы можете явно сохранить его как файл, вызвав doc2.Save (имя файла), если хотите.

Также обратите внимание, что некоторые люди предпочитают LINQ-версию (XDocument) для XML-документа, чтобы они могли запускать запросы LINQ против него. Объект XmlDocument поддерживает запрос XPath, но это несколько неэффективно, поскольку он не может статически компилировать запрос, он должен анализироваться во время выполнения. Однако, что вы используете, действительно зависит от вашего конкретного приложения.

Смежные вопросы