2010-09-08 3 views
0

У меня есть XML, который выглядит следующим образом:Force XML символьных объектов в XmlDocument

<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 XML XmlDocument? Возможно ли это? Я надеюсь избежать строковых манипуляций с OuterXml ...

ответ

3

Вам в основном не повезло.

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

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

(See section 4.1 of the XML spec)

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

Строка "ATamp;T;" расширяется до " AT&T;", а остальной амперсанд не распознаются как сущность-ссылки разделителя

(See section 4.4 of the XML spec)

Это запеченная в Спецификация 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

фантастический ответ. У меня было некоторое ощущение, что «{» никогда не будет внутренне представлен как {, поэтому XmlDocument не будет «удерживать» это представление. – TesterTurnedDeveloper

0

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

+0

Часть проблемы заключается в том, что установка атрибута «{» приведет к XML, который выглядит как «& # 123;». Я пытаюсь заставить XmlDocument использовать объект, который я хочу, но не имеющий большой удачи. – TesterTurnedDeveloper

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