Чтение содержимого файла XML без необходимости удаления объявления XML - PullRequest
4 голосов
/ 16 декабря 2011

Я хочу прочитать все содержимое XML из файла. Приведенный ниже код работает только при удалении декларации XML (<?xml version="1.0" encoding="UTF-8"?>). Как лучше всего прочитать файл, не удаляя объявление XML?

XmlTextReader reader = new XmlTextReader(@"c:\my path\a.xml");
            reader.Read();
            string rs = reader.ReadOuterXml();

Не удаляя объявление XML, reader.ReadOuterXml() возвращает пустую строку.

<?xml version="1.0" encoding="UTF-8"?>  
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://www.as.com/ver/ver.IClaimver/Car</a:Action>
    <a:MessageID>urn:uuid:b22149b6-2e70-46aa-8b01-c2841c70c1c7</a:MessageID>
    <ActivityId CorrelationId="16b385f3-34bd-45ff-ad13-8652baeaeb8a" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">04eb5b59-cd42-47c6-a946-d840a6cde42b</ActivityId>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1">http://localhost/ver.Web/ver2011.svc</a:To>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Car xmlns="http://www.as.com/ver">
      <carApplication>
        <HB_Base xsi:type="HB" xmlns="urn:core">
          <Header>
            <Advisor>
              <AdvisorLocalAuthorityCode>11</AdvisorLocalAuthorityCode>
              <AdvisorType>1</AdvisorType>
            </Advisor>
          </Header>
          <General>
            <ApplyForHB>yes</ApplyForHB>
            <ApplyForCTB>yes</ApplyForCTB>
            <ApplyForFSL>yes</ApplyForFSL>
            <ConsentSupplied>no</ConsentSupplied>
            <SupportingDocumentsSupplied>no</SupportingDocumentsSupplied>
          </General>
        </HB_Base>
      </carApplication>
    </Car>
  </s:Body>
</s:Envelope>

Обновление

Я знаю другие методы, которые используют NON-xml reader (например, с использованием File.ReadAllText()). Но мне нужно знать способ, который использует метод xml.

Ответы [ 5 ]

6 голосов
/ 16 декабря 2011

Перед объявлением кодировки <?xml ?>, кроме спецификации, не должно быть текста или пробелов, а между объявлением и корневым элементом, кроме разрыва строки, не должно быть текста.

Все остальное является недействительным документом.

UPDATE:

Я думаю, что ваше ожидание XmlTextReader.read () неверно.

Каждый вызов XmlTextReader.Read () проходит по следующему «токену» в документе XML, по одному токену за раз. «Токен» означает элементы XML, пробелы, текст и объявление кодировки XML .

Ваш вызов reader.ReadOuterXML () возвращает пустую строку, потому что первый токен в вашем XML-файле является объявлением XML, а объявление XML не имеет OuterXML.

Рассмотрим этот код:

    XmlTextReader reader = new XmlTextReader("test.xml");
    reader.Read();
    Console.WriteLine(reader.NodeType);  // XMLDeclaration
    reader.Read();
    Console.WriteLine(reader.NodeType);  // Whitespace
    reader.Read();
    Console.WriteLine(reader.NodeType);  // Element
    string rs = reader.ReadOuterXml();

Приведенный выше код дает такой вывод:

XmlDeclaration
Whitespace
Element

Первым «токеном» является объявление XML.

Второй встреченный «токен» - это разрыв строки после объявления XML.

Третий встреченный "токен" - это элемент <s:Envelope>. Отсюда вызов метода reader.ReadOuterXML () вернет то, что, я думаю, вы ожидаете увидеть - текст элемента <s:Envelope>, который является целым пакетом мыла.

Если вы действительно хотите загрузить XML-файл в память как объекты, просто вызовите var doc = XDocument.Load("test.xml") и сделать разбор одним махом.

Если вы не работаете с документом XML, который настолько чудовищен, что не помещается в системную память, на самом деле не так уж много причин просматривать документ XML по одному токену за раз.

2 голосов
/ 16 декабря 2011

А как же

XmlDocument doc=new XmlDocument;
doc.Load(@"c:\my path\a.xml");
//Now we have the XML document - convert it to a String
//There are many ways to do this, one should be:
StringWriter sw=new StringWriter();
doc.Save(sw);
String finalresult=sw.ToString();
1 голос
/ 16 декабря 2011

ИМХО, вы не можете прочитать этот файл.Это потому, что перед корневым элементом <s:Envelope> есть простой текст, который делает весь документ недействительным.

1 голос
/ 16 декабря 2011

РЕДАКТИРОВАТЬ: я предполагаю, что вы имеете в виду на самом деле есть текст между декларацией документа и корневым элементом. Если это не так, пожалуйста, уточните.

Без удаления лишнего текста это просто неверный XML-файл. Я не ожидал бы , что это сработает. У вас нет XML-файла - у вас есть что-то, похожее на XML-файл, но с посторонним материалом перед корневым элементом.

0 голосов
/ 16 декабря 2011

Вы анализируете документ XML как XML только для получения исходного текста? Почему?

Если вы действительно хотите это сделать, то:

string rs;
using(var rdr = new StreamReader(@"c:\my path\a.xml"))
  rs = rdr.ReadToEnd();

Будет работать, но я действительно не уверен, что это то, что вы на самом деле хотите. Это в значительной степени игнорирует, что это XML, и просто читает текст. Полезно для некоторых вещей, но не много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...