почему XML не читается из строки? (но будет из .txt тех же данных) - PullRequest
0 голосов
/ 28 августа 2011

это код, о котором идет речь:

using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
{
    using (var readerz = file.CreateViewAccessor(0, 0))
    {
        var bytes = new byte[567];
        var encoding = Encoding.ASCII;
        readerz.ReadArray<byte>(0, bytes, 0, bytes.Length);

        File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes));

        var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
        using (var reader = XmlReader.Create("C:\\myFile.txt", readerSettings))
        {

Вот как выглядит myfile.txt:

<sys><id>SCPUCLK</id><label>CPU Clock</label><value>1598</value></sys><sys><id>SCPUFSB</id><label>CPU FSB</label><value>266</value></sys><sys><id>SMEMSPEED</id><label>Memory Speed</label><value>DDR2-667</value></sys><sys><id>SFREEMEM</id><label>Free Memory</label><value>415</value></sys><sys><id>SGPU1CLK</id><label>GPU Clock</label><value>562</value></sys><sys><id>SFREELVMEM</id><label>Free Local Video Memory</label><value>229</value></sys><temp><id>TCPU</id><label>CPU</label><value>42</value></temp><temp><id>TGPU1</id><label>GPU</label><value>58</value></temp>

, если я записываю данные в текстовый файл на жестком дискес помощью:

File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes));

затем прочитайте тот же текстовый файл с фрагментом XmlReader:

 XmlReader.Create("C:\\myFile.txt");

, он читает его очень хорошо, программа запускается и завершается так, как и должно, но тогда, еслиЯ напрямую читаю с фрагментом XmlReader, например:

XmlReader.Create(encoding.GetString(bytes));

Я получаю исключение при запуске "недопустимых символов в пути" в строке XmlReader.Create.

Я пытался записать его в отдельную строкусначала и прочитав это с помощью xmlreader, и это не поможет попытаться распечатать его в CMD, чтобы увидеть, как он выглядит, потому что CMD не будет отображать недопустимые символы, с которыми я имею дело, правильно?1021 * и он точно соответствует текстовому файлу.

, поэтому как-то записать его в текстовый файл удаляет некоторые "недопустимые символы"?что вы, ребята, думаете?

Ответы [ 4 ]

7 голосов
/ 28 августа 2011
XmlReader.Create(encoding.GetString(bytes));

XmlReader.Create() интерпретирует вашу строку как URI, из которого она должна прочитать файл.Вместо этого инкапсулируйте ваши байты в StringReader:

StringReader sr = new StringReader(encoding.GetString(bytes));
XmlReader.Create(sr);
5 голосов
/ 28 августа 2011

Здесь:

XmlReader.Create(encoding.GetString(bytes));

вы просто вызываете следующий метод , который принимает строку, представляющую имя файла. Однако вы передаете ему фактическую строку XML, которая, очевидно, является неверным именем файла.

Если вы хотите загрузить ридер из буфера, вы можете использовать поток :

byte[] bytes = ... represents the XML bytes
using (var stream = new MemoryStream(bytes))
using (var reader = XmlReader.Create(stream))
{
    ...
}
3 голосов
/ 28 августа 2011

Вы передаете контент XML в том месте, где он ожидает путь, о чем свидетельствует ошибка - illegal characters in path

Используйте соответствующую перегрузку и передайте поток - http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.create.aspx

3 голосов
/ 28 августа 2011

Для метода XmlReader.Create() с одним string в качестве аргумента необходим переданный URI, а не XML-документ в виде строки, см. MSDN Он пытается открыть файл с именем «<...», который является недопустимым URI. Вы можете передать поток вместо этого. </p>

...