Чтение содержимого файла XML без необходимости удаления объявления XML
Я хочу прочитать все содержимое 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 ответов
Перед текстом не должно быть текста или пробелов. <?xml ?>
объявление кодировки, отличное от спецификации, и отсутствие текста между объявлением и корневым элементом, кроме разрыва строки.
Все остальное является недействительным документом.
ОБНОВИТЬ:
Я думаю, что ваше ожидание 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>
элемент. Отсюда вызов читателя. ReadOuterXML () вернет то, что, я думаю, вы ожидаете увидеть - текст <s:Envelope>
элемент, который является всем пакетом мыла.
Если вы действительно хотите загрузить XML-файл в память как объекты, просто вызовите var doc = XDocument.Load("test.xml")
и сделать разбор одним махом.
Если вы не работаете с документом XML, который настолько чудовищен, что не помещается в системную память, на самом деле не так уж много причин просматривать документ XML по одному токену за раз.
Как насчет
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();
ИМХО, вы не можете прочитать этот файл. Это потому, что перед корневым элементом есть простой текст <s:Envelope>
что делает весь документ недействительным.
РЕДАКТИРОВАТЬ: я предполагаю, что вы имеете в виду текст на самом деле между декларацией документа и корневым элементом. Если это не так, пожалуйста, уточните.
Без удаления лишнего текста это просто неверный XML-файл. Я не ожидал бы, что это сработает. У вас нет XML-файла - у вас есть что-то, похожее на XML-файл, но с посторонним материалом перед корневым элементом.
Вы анализируете XML-документ как XML только для получения исходного текста? Зачем?
Если вы действительно хотите это сделать, то:
string rs;
using(var rdr = new StreamReader(@"c:\my path\a.xml"))
rs = rdr.ReadToEnd();
Будет работать, но я действительно не уверен, что это то, что вы на самом деле хотите. Это в значительной степени игнорирует, что это XML, и просто читает текст. Полезно для некоторых вещей, но не много.