2014-10-31 2 views
1

Я хочу прочитать строку xml, игнорирующую заголовок и комментарии.Как читать строку xml, игнорирующую заголовок?

Чтобы проигнорировать комментарии, это просто, и я нашел решение here. Но я не нашел решения, чтобы игнорировать заголовок.

Позвольте мне привести пример:

Рассмотрим этот XML:

<?xml version="1.0" encoding="iso-8859-1"?> 
<!-- Some comments --> 
<Tag Attribute="3"> 
    ... 
</Tag> 

Я хочу, чтобы прочитать XML в строку получение только элемент «Tag» и другие элементы, но withou на «XML версии "и комментариев.

Элемент «Тег» является лишь примером. Может существовать много других.

Итак, я хочу только это:

<Tag Attribute="3"> 
    ... 
</Tag> 

код, который я пришел до сих пор:

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.IgnoreComments = true; 
XmlReader reader = XmlReader.Create("...", settings); 
xmlDoc.Load(reader); 

И я ничего на XmlReaderSettings не находя, чтобы сделать это.

Нужно ли идти узлом по узлу, выбрав только те, которые мне нужны? Этот параметр не существует?

EDIT 1: Просто для возобновления моей проблемы. Мне нужно содержимое xml для использования в CDATA WebService. Когда я отправляю комментарии или xml-версию, я получаю определенную ошибку в этой части xml. Поэтому я предполагаю, что когда я прочитаю xml без версии, заголовком и комментариями, я буду в порядке.

+1

Очень странно, что спросить - чувствует, как [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) ... Что ваша реальная проблема ? Возможно, если кодировка неверна, вы можете использовать чтение XML из строки ... –

+0

'XmlReader' не должен возвращать заголовок в качестве узла. Если вы перебираете свои узлы, вы не должны видеть заголовок. – MikeH

+0

@Mihai: Мне нужно было подождать 2 дня, чтобы выбрать моего собственного абрисера. :) –

ответ

1

Ну, кажется, что нет никаких настроек игнорировать заявления, так что я должен был игнорировать это сам.

Вот код, который я написал для тех, кто может быть заинтересован:

private string _GetXmlWithoutHeadersAndComments(XmlDocument doc) 
{ 
    string xml = null; 

    // Loop through the child nodes and consider all but comments and declaration 
    if (doc.HasChildNodes) 
    { 
     StringBuilder builder = new StringBuilder(); 

     foreach (XmlNode node in doc.ChildNodes) 
      if (node.NodeType != XmlNodeType.XmlDeclaration && node.NodeType != XmlNodeType.Comment) 
       builder.Append(node.OuterXml); 

     xml = builder.ToString(); 
    } 

    return xml; 
} 
0

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

Для вашего xmlDoc объекта:

var nodes = xmlDoc.DocumentElement.SelectNodes("Tag"); 

Вы можете итерацию через них так:

foreach (XmlNode node in nodes) { } 

Или, очевидно, вы можете просто поставить SelectNodes запрос в петлю Еогеасп, если вы никогда не будет повторно использовать объект узлов.

Это вернет все элементы тега в вашем XML-документе, и вы сможете делать все, что сочтете нужным.

Нет необходимости когда-либо сталкиваться с комментариями при использовании XmlDocument, если вы этого не хотите, и вы не получите результатов, включая заголовок или комментарии. Есть ли какая-то конкретная причина, по которой вы пытаетесь удалить фрагменты XML, прежде чем приступать к его синтаксическому анализу?

Редактировать: На основании вашего редактирования кажется, что у вас возникла проблема с заголовком, который дает ошибку при попытке передать его. Вы, вероятно, не должны правильно удалять заголовок, поэтому лучшим вариантом может быть изменение заголовка на тот, который, как вы знаете, работает.Вы можете изменить заголовок (объявление) следующим образом:

XmlDeclaration xmlDeclaration; 
xmlDeclaration = yourDocument.CreateXmlDeclaration(
            yourVersion, 
            yourEncoding, 
            isStandalone); 
yourDocument.ReplaceChild(xmlDeclaration, doc.FirstChild); 
+0

Я не знаю, какие теги могут существовать. Я знаю, что я могу зацикливаться после всех узлов и использовать только элементы. Но это должен быть более простой способ сделать это, как показано в XmlReaderSettings. –

+0

@ IúridosAnjos Более простой способ сделать что? Даже с вашим редактированием, я не уверен на 100%, я понимаю. – furkle

+0

Я надеялся, что некоторые настройки уже существуют. Подобно «IgnoreComment» из XmlReaderSettings. –

1

Вот очень простое решение.

using (var reader = XmlReader.Create(/*reader, stream, etc.*/) 
{ 
    reader.MoveToContent(); 
    string content = reader.ReadOuterXml(); 
} 
Смежные вопросы