Декодируйте раздел CDATA в C#

Если Вы действительно не обеспокоены производительностью, и этим я имею в виду, "Почему Вы используете.Net вместо C++?" необходимо придерживаться List<>. Это легче поддержать и делает всю грязную работу изменения размеров массива негласно для Вас. (При необходимости, List<> довольно умно о выборе размеров массива, таким образом, он не должен обычно.)

11
задан Jess 6 August 2009 в 22:09
поделиться

3 ответа

Вы можете использовать Linq для чтения CDATA.

XDocument xdoc = XDocument.Load("YourXml.xml");
xDoc.DescendantNodes().OfType<XCData>().Count();

Таким способом очень легко получить значение.

Вот хороший обзор MSDN: http: // msdn. microsoft.com/en-us/library/bb308960.aspx

для .NET 2.0 вам, вероятно, просто нужно передать его через Regex:

     string xml = @"<section>
                      <description>
                        <![CDATA[
                          This is a ""description""
                          that I have formatted
                        ]]>
                      </description>
                    </section>";

        XPathDocument xDoc = new XPathDocument(new StringReader(xml.Trim()));
        XPathNavigator nav = xDoc.CreateNavigator();
        XPathNavigator descriptionNode = 
            nav.SelectSingleNode("/section/description");

        string desiredValue = 
            Regex.Replace(descriptionNode.Value
                                     .Replace(Environment.NewLine, String.Empty)
                                     .Trim(),
                @"\s+", " ");

, который обрезает значение вашего узла, заменяет символы новой строки пустыми и заменяет 1+ пробелов с одним пробелом. Я не думаю, что есть другой способ сделать это, учитывая, что CDATA возвращает значительный пробел.

18
ответ дан 3 December 2019 в 01:16
поделиться

Блоки CDATA фактически дословны. Любые пробелы внутри CDATA значимы по определению согласно спецификации XML. Следовательно, вы получаете этот пробел при извлечении значения узла. Если вы хотите удалить его, используя свои собственные правила (поскольку спецификация XML не определяет какой-либо стандартный способ удаления пробелов в CDATA), вы должны сделать это самостоятельно, используя String.Replace , Regex .При необходимости замените и т. Д.

3
ответ дан 3 December 2019 в 01:16
поделиться

На самом деле, я думаю, все довольно просто. Секция CDATA будет загружена в XmlDocument как другой XmlNode с той разницей, что этот узел будет иметь свойство NodeType = CDATA, что означает, если у вас есть XmlNode node = doc. SelectSingleNode("section/description"); у этого узла будет ChildNode со свойством InnerText, заполненным чистыми данными, и если вы хотите удалить специальные символы, просто используйте Trim() и у вас будут данные.

Код будет выглядеть как

XmlNode cDataNode = doc.SelectSingleNode("section/description").ChildNodes[0];
string finalData = cDataNode.InnerText.Trim();

Спасибо
XOnDaRocks

9
ответ дан 3 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: