我有一个像这样的字节流:
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文件,它只是一个内存集合吗?
答案 0 :(得分: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>
无关的&#34; EZE-XML-Msg02&#34;造成了这个问题。你想要修剪这个部分(你可以做string.move如果你知道这将提前的长度或string.Split(&#39;,&#39;)并使用它来找到长度,如果你别&#39; T)。或者,更好的是,如果可能的话,首先阻止它进入XML。
此时有几点注意事项。首先,你的解码方法肯定会有效,但你可能想把MemoryStream放在&#34;使用&#34;块。另一种进行解码的方法如下:
string str = ASCIIEncoding.ASCII.GetString(response);
它会为你解码字符串。你可以做到
doc2.LoadXml(str);
并且它会为您加载文档。
此时,XmlDocument对象本身只是一个内存中的集合。如果您愿意,可以通过调用doc2.Save(filename)将其显式保存为文件。
另请注意,有些人更喜欢LINQ版本(XDocument)到XML Document,因此他们可以针对它运行LINQ查询。 XmlDocument对象支持XPath查询,但由于它无法静态编译查询,因此它必须在运行时进行解析。您使用的确实取决于您的具体应用。
答案 1 :(得分: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);
}