2016-04-20 3 views
-1

UPDATE: Добавлены более подробно на каждый запросВключите XML CDATA в элементе

Я пытаюсь создать файл конфигурации XML для моего приложения. Файл содержит список критериев поиска и замены в html-документе. Проблема в том, что мне нужно искать строки символов, такие как &nbsp. Я не хочу, чтобы мой код читал декодированный элемент, но сам текст.

Признавая себя очень новым в XML, я сделал некоторые попытки удовлетворить требования. Я прочитал загрузку ссылок здесь на Stackoverflow относительно CDATA и ATTRIBUTES и т. Д., Но примеры здесь (и в других местах), похоже, сосредоточены на создании одной отдельной строки в XML-файле, а не нескольких.

Вот одна из многих попыток я сделал без толку:

<?xml version="1.0" encoding="utf-8" ?> 
<!DOCTYPE item [ 
    <!ELEMENT item (id, replacewith)> 
    <!ELEMENT id (#CDATA)> 
    <!ELEMENT replacewith (#CDATA)> 
    ]> 
]> 
<item id=" " replacewith="&nbsp;">Non breaking space</item> 
<item id="&#8209;" replacewith="-">Non breaking hyphen</item> 

Этот документ дает мне ряд ошибок, в том числе:

  • В DOCTYPE, я получаю сообщение об ошибке, как <!ELEMENT id (#CDATA)> , В области CDATA Visual Studio сообщает мне, что ожидает «,» или «|».
  • ]> дает мне ошибку invalid token at the root of the document.
  • И, конечно же, после второй записи <item, я получаю сообщение об ошибке XML document cannot contain multiple root level elements.

Как я могу написать файл XML, который включает в себя несколько элементов и позволяет мне сохранять и извлекать текст внутри элемента, а не интерпретированных символов?

Если это помогает, я использую .Net, C# и Visual Studio.

EDIT: Цель этого XML-файла, чтобы обеспечить свой код со списком вещей для поиска и замены в HTML-файл. Файл xml просто содержит список what to search for и what to replace with.

Вот файл я имею в месте прямо сейчас:

<?xml version="1.0" encoding="utf-8" ?> 
<Items> 
    <item id="&#8209;" replacewith="-">Non breaking hyphen</item> 
    <item id=" " replacewith="&nbsp;">Non breaking hyphen</item> 
</Items> 

Используя первый в качестве примера, я хочу, чтобы читать текст &#8209, но вместо того, чтобы, когда я прочитал это, я получаю -, потому что это то, что код представляет.

Любая помощь или указатели, которые вы можете дать, были бы полезными.

+0

Непонятно, чего вы пытаетесь достичь. Образец * действительного * XML, который вы хотите увидеть, поможет. Если вы пытаетесь читать/писать XML с помощью строковых манипуляций/регулярных выражений - прекратите это делать (или, по крайней мере, не спрашивайте об этом на SO). –

+0

Я обновил описание более подробно и XML-файл, который я использую. В основном, я пытаюсь скомпилировать список строк, которые я хочу найти и заменить в html-файле. Эти строки настраиваются пользователем, поэтому я решил, что сохраню их в файле конфигурации xml. Я в основном хочу прочитать текст, содержащийся в атрибуте, как сырую строку, а не расшифрованную строку. – Bill

+0

Если вы хотите текст, закодируйте его. Например, NBSP будет «& nbsp;' –

ответ

1

Чтобы уточнить мой комментарий: XML действует как HTML из-за зарезервированных символов. Символы перпендикулярных префиксов или кодов символов для перевода в литеральную строку при чтении с любым типом анализатора (браузер, XML-ридер и т. Д.).

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

 XmlDocument xmlDoc = new XmlDocument(); 
    XmlElement xmlItem; 
    XmlAttribute xmlAttr; 
    XmlText xmlText; 

    // Declaration 
    XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null); 
    XmlElement xmlRoot = xmlDoc.DocumentElement; 
    xmlDoc.InsertBefore(xmlDec, xmlRoot); 

    // Items 
    XmlElement xmlItems = xmlDoc.CreateElement(string.Empty, "Items", string.Empty); 
    xmlDoc.AppendChild(xmlItems); 

    // Item #1 
    xmlItem = xmlDoc.CreateElement(string.Empty, "item", string.Empty); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "id", string.Empty); 
    xmlAttr.Value = "&#8209;"; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "replacewith", string.Empty); 
    xmlAttr.Value = "-"; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlText = xmlDoc.CreateTextNode("Non breaking hyphen"); 
    xmlItem.AppendChild(xmlText); 

    xmlItems.AppendChild(xmlItem); 

    // Item #2 
    xmlItem = xmlDoc.CreateElement(string.Empty, "item", string.Empty); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "id", string.Empty); 
    xmlAttr.Value = " "; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlAttr = xmlDoc.CreateAttribute(string.Empty, "replacewith", string.Empty); 
    xmlAttr.Value = "&nbsp;"; 
    xmlItem.Attributes.Append(xmlAttr); 
    xmlText = xmlDoc.CreateTextNode("Non breaking hyphen"); 
    xmlItem.AppendChild(xmlText); 

    xmlItems.AppendChild(xmlItem); 

    // For formatting 
    StringBuilder xmlBuilder = new StringBuilder(); 
    XmlWriterSettings xmlSettings = new XmlWriterSettings 
    { 
     Indent = true, 
     IndentChars = " ", 
     NewLineChars = "\r\n", 
     NewLineHandling = NewLineHandling.Replace 
    }; 
    using (XmlWriter writer = XmlWriter.Create(xmlBuilder, xmlSettings)) 
    { 
     xmlDoc.Save(writer); 
    } 

    xmlOutput.Text = xmlBuilder.ToString(); 

Обратите внимание, что я положил в ваших id ценностей с тем, что вы ожидаете.Теперь посмотрим, как он будет закодирован:

<?xml version="1.0" encoding="utf-16"?> 
<Items> 
    <item id="&amp;#8209;" replacewith="-">Non breaking hyphen</item> 
    <item id=" " replacewith="&amp;nbsp;">Non breaking hyphen</item> 
</Items> 

Единственное различие между вашими и этот в том, что амперсанд был закодирован как &amp;, а остальные остались в виде строкового литерала. Это нормальное поведение для XML. Когда вы прочтете это, он вернется как буква &#8209; и &nbsp;.

+0

Этот подход также применяется для других зарезервированных символов, таких как '<' изменение на '<' и '>' изменение на '>' (и наоборот). Для получения дополнительной информации об объекте ознакомьтесь с этим: https://dev.w3.org/html5/html-author/charref –

+0

Привет Крис. Спасибо, что предложили это. Я буду проверять сегодня. Я думаю, что основное различие здесь заключается в том, что вы создали способ просто создать простой XML-документ и сохранить информацию, тогда как я пытался заставить XML обрабатывать текст как литеральные строки. На данный момент я открыт для любого решения, которое работает :-) – Bill

+0

Я просто показывал, что при создании XML-документа он автоматически кодирует его правильно. Если вам нужно было сделать это вручную, вам нужно будет вручную закодировать его, например '& # 8209;'. В основном, просто замените свой первый экземпляр амперсанда в каждом атрибуте с помощью '&' –