LINQ to XML y entidades XML personalizados
Pregunta
Quiero crear un documento MathML de un árbol de expresión utilizando LINQ to XML, pero no puedo encontrar la manera de utilizar las entidades XML MathML (tales como y Y InvisibleTimes): Cuando trato de crear directamente una XElement utilizando
XElement xe = new XElement("mo", "&InvisibleTimes");
justs se escapa el signo (lo cual no es bueno). También probé a usar XElement.Parse
XElement xe = new XElement.Parse("<mo>&InvisibleTimes</mo>");
pero falla con un System.XmlException: Referencia a la entidad no declarada 'InvisibleTimes' ¿Cómo puedo declarar la entidad o ignorar los cheques?
Solución
Como otros han señalado, no hay forma directa de hacerlo.
Dicho esto, puede intentar utilizar la correspondiente caracther Unicode. Según http://www.w3.org/TR/MathML2/mmlalias.html , por applyFunction es 02061, probar nuevas XElement ( "mo", "\ u02061")
Otros consejos
De acuerdo con este enhebrar , LINQ to XML no incluye referencias a entidades: que no tiene ningún tipo de nodo para ellos. Sólo ellos se expande cuando se carga un archivo, y después de eso sólo tienes personajes "normales".
No sé sobre XDocument
, pero se puede hacer con XmlDocument
:
XmlDocument doc = new XmlDocument();
var entity = doc.CreateEntityReference("InvisibleTimes");
XmlElement root = (XmlElement)doc.AppendChild(doc.CreateElement("xml"));
var el = root.AppendChild(doc.CreateElement("mo")).AppendChild(entity);
string s = doc.OuterXml;
Es posible que necesite xml codificar los nombres porque 'Y' es un carácter especial.
Así que en lugar de
XElement xe = new XElement("mo", "&InvisibleTimes");
try
XElement xe = new XElement("mo", "&InvisibleTimes");
Creo que se necesita un DTD para definir
MathML 2.0 proporciona una XHTML + MathML DTD.
Una solución consiste en utilizar cualquier marcador de posición para el y como ;_amp_;
XElement xe = new XElement("mo", ";_amp_;InvisibleTimes)
y restaurarlo cuando llegue a la cadena XML:
output = xe.ToString().Replace(";_amp_;", "&")