2012-04-11 4 views
1

В XmlDocument при записи или изменении позже можно удалить самозакрывающиеся теги (т. Е. />) для определенного элемента.Удаление самозакрывающихся тегов (например, />) в XmlDocument

Например: изменение

  • <img /> или <img></img> к <img>.
  • <br /> до <br>.

Почему вы спрашиваете? Я пытаюсь соответствовать схеме HTML для Word 2007; итоговый HTML будет отображаться в Microsoft Outlook 2007 или более поздней версии.

После прочтения еще StackOverflow question, я попробовал установить IsEmpty на false так.

var imgElements = finalHtmlDoc.SelectNodes("//*[local-name()=\"img\"]").OfType<XmlElement>(); 
foreach (var element in imgElements) 
{ 
    element.IsEmpty = false; 
} 

Однако это привело к <img /> становится <img></img>. Кроме того, в качестве взлома я также попытался изменить свойство OuterXml непосредственно, но это не работает (не ожидал этого).

Вопрос

Вы можете удалить самозакрывающиеся теги XmlDocument? I честно не думаю, что есть, так как тогда это было бы недопустимым xml (без закрывающего тега), однако я подумал, что я выброшу вопрос из сообщества.

Update:

Я в конечном итоге фиксируя строку HTML после экспорта из XmlDocument, используя регулярное выражение (написано в замечательной RegexBuddy).

var fixHtmlRegex = new Regex("<(?<tag>meta|img|br)(?<attributes>.*?)/>", RegexOptions.IgnoreCase | RegexOptions.Multiline); 
    return fixHtmlRegex.Replace(htmlStringBuilder.ToString(), "<$1$2>"); 

Он очистил многие ошибки от пропусков проверки и позволил мне сосредоточиться на реальных проблемах совместимости.

+1

Использование ' и' '
отлично работает в офисе 2007/10, есть еще одна причина для преобразования в стиле HTML4 теги? – Matthew

+0

глядя на ответы, которые вы знаете, вы не можете сделать это через XMLDocument. Но если вы действительно этого хотите, почему бы вам не попробовать создать текстовый файл со строковыми операциями в XML, таким образом вы сможете достичь своей задачи. – Habib

+0

@Matthew: Да, они делают; единственная причина заключалась в том, чтобы утвердить схему [HTML для Word 2007] (http://msdn.microsoft.com/en-us/library/aa338201%28office.12%29.aspx), чтобы в более поздней точке преобразование могло быть протестированным. – Dennis

ответ

3

Вы правы: это невозможно, потому что оно недействительно (или, скорее, не правильно сформировано) XML. Пустые элементы в XML необходимо закрыть, будь то синтаксис ярлыка /> или с закрывающим тегом.

+4

Странно, что 'XmlWriter' не позволит вам писать неверный XML. – Oded

+6

Он должен был использовать для этого класс 'InvalidXmlWriter'. –

+0

Как я и думал. Спасибо за быстрый ответ. @ Матвей был прав в своем комментарии к вопросу; оба тега отлично работают в Office 2007/10. – Dennis

0

<img> недействителен XML, поэтому нет, вы не можете этого сделать.

1

Оба HTML и XML являются приложениями SGML. Хотя HTML и SGML разрешают открытые теги, например <br>, XML нет.

0

Немного смущенный моим ответом, но он работал на то, что мне нужно. После того, как у вас есть полный XML-документ, который вы можете соеденить манипулировать его, чтобы очистить его вверх ...

private string RemoveSelfClosingTags(string xml) 
    { 
     char[] seperators = { ' ', '\t', '\r', '\n' }; 

     int prevIndex = -1; 
     while (xml.Contains("/>")) 
     { 
      int selfCloseIndex = xml.IndexOf("/>"); 
      if (prevIndex == selfCloseIndex) 
       return xml; // we are in a loop... 

      prevIndex = selfCloseIndex; 

      int tagStartIndex = -1; 

      string tag = ""; 

      //really? no backwards indexof? 
      for (int i = selfCloseIndex; i > 0; i--) 
      { 
       if (xml[i] == '<') 
       { 
        tagStartIndex = i; 
        break; 
       } 
      } 


      int tagEndIndex = xml.IndexOfAny(seperators, tagStartIndex); 
      int tagLength = tagEndIndex - tagStartIndex; 
      tag = xml.Substring(tagStartIndex + 1, tagLength - 1); 


      xml = xml.Substring(0, selfCloseIndex) + "></" + tag + ">" + xml.Substring(selfCloseIndex + 2); 
     } 

     return xml; 

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^