Заставить символьные объекты XML в XmlDocument - PullRequest
0 голосов
/ 08 сентября 2010

У меня есть какой-то XML, который выглядит так:

<abc x="{"></abc>

Я хочу заставить XmlDocument использовать символьные сущности XML в скобках, например:

<abc x="&#123;"></abc>

MSDN говорит это:

Чтобы присвоить значение атрибута который содержит ссылки на сущности, пользователь должен создать узел XmlAttribute плюс любой XmlText и Узлы XmlEntityReference, создайте соответствующее поддерево и использование SetAttributeNode, чтобы назначить его как значение атрибута.

CreateEntityReference звучит многообещающе, поэтому я попробовал это:

XmlDocument doc = new XmlDocument();
doc.LoadXml("<abc />");
XmlAttribute x = doc.CreateAttribute("x");
x.AppendChild(doc.CreateEntityReference("#123"));
doc.DocumentElement.Attributes.Append(x);

И я получаю исключение Cannot create an 'EntityReference' node with a name starting with '#'.

Любая причина, почему CreateEntityReference не нравится '#' - и что более важно, как я могу получить символьную сущность в XML XmlDocument? Это вообще возможно? Я надеюсь избежать строковых манипуляций с OuterXml ...

Ответы [ 2 ]

3 голосов
/ 08 сентября 2010

Тебе в основном не повезло.

Во-первых, то, с чем вы имеете дело, называется ссылками на символы, поэтому CreateEntityReference завершается ошибкой. Единственная причина существования ссылки на символ состоит в том, чтобы предоставить доступ к символам, которые были бы недопустимы в данном контексте или иным образом сложны для создания.

Определение: ссылка на символ относится к конкретному персонажу в Набор символов ISO / IEC 10646, для пример один не доступен напрямую из доступных устройств ввода.

( См. Раздел 4.1 спецификации XML )

Когда процессор XML встречает символьную ссылку, если на него ссылаются в значении атрибута (то есть, если в атрибуте используется формат &#xxx), ему присваивается значение «Включено», что означает его значение. ищется и текст заменяется.

Строка "ATamp;T;" расширяется до " AT&T; ", а оставшийся амперсанд не признается как ссылка на объект Разделитель

( См. Раздел 4.4 спецификации XML )

Это встроено в спецификацию XML, а стек Microsoft XML делает то, что требуется: обрабатывает ссылки на символы.

Лучшее, что я могу увидеть, это взглянуть на эти старые статьи XML.com, одна из которых использует XSL для отключения экранирования выходных данных, поэтому &amp;#123; превратится в &#123; в выходных. http://www.xml.com/pub/a/2001/03/14/trxml10.html

<!DOCTYPE stylesheet [
<!ENTITY ntilde 
"<xsl:text disable-output-escaping='yes'>&amp;ntilde;</xsl:text>">
]>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">

  <xsl:output doctype-system="testOut.dtd"/>

  <xsl:template match="test">
    <testOut>
      The Spanish word for "Spain" is "Espa&ntilde;a".
      <xsl:apply-templates/>
    </testOut>
  </xsl:template>

</xsl:stylesheet>

И этот, который использует XSL для преобразования определенных символьных ссылок в другие текстовые последовательности (для достижения той же цели, что и предыдущая ссылка).
http://www.xml.com/lpt/a/1426

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

  <xsl:output use-character-maps="cm1"/>

  <xsl:character-map name="cm1">
    <xsl:output-character character="&#160;" string="&amp;nbsp;"/>   
    <xsl:output-character character="&#233;" string="&amp;233;"/> <!-- é -->
    <xsl:output-character character="ô" string="&amp;#244;"/>
    <xsl:output-character character="&#8212;" string="--"/>
  </xsl:character-map>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 08 сентября 2010

Вы всегда должны манипулировать своими строками с помощью предшествующего @, например @ "My /?., <> STRING".Я не знаю, решит ли это вашу проблему.Я хотел бы подойти к проблеме, используя класс XmlNode из XmlDocument.Вы можете использовать свойство Attributes, и это будет намного проще.Проверьте это здесь: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.attributes.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...