Linq to Xml и пользовательские объекты xml - PullRequest
1 голос
/ 01 апреля 2009

Я хочу создать документ MathML из дерева выражений с использованием Linq to xml, но не могу понять, как использовать объекты MathML xml (такие как & ApplyFunction; и & InvisibleTimes): Когда я пытаюсь создать XElement напрямую, используя

XElement xe = new XElement("mo", "&InvisibleTimes");

это просто ускользает от амперсанда (что нехорошо). Я также пытался использовать XElement.Parse

XElement xe = new XElement.Parse("<mo>&InvisibleTimes</mo>");

но происходит сбой с System.XmlException: ссылка на необъявленную сущность 'InvisibleTimes' Как я могу объявить объект или проигнорировать проверки?

Ответы [ 6 ]

2 голосов
/ 02 апреля 2009

Согласно этой теме , LINQ to XML не содержит ссылок на сущности: для них нет типа узла. Он просто расширяет их при загрузке файла, и после этого у вас просто появляются «нормальные» символы.

1 голос
/ 02 апреля 2009

Как уже отмечали другие, прямого способа сделать это не существует.

Тем не менее, вы можете попробовать использовать соответствующий символ Unicode. Согласно http://www.w3.org/TR/MathML2/mmlalias.html, для ApplyFunction это 02061, попробуйте новый XElement ("mo", "\ u02061")

0 голосов
/ 28 марта 2019

Обходной путь - использовать любой символ-заполнитель для &, например ;_amp_; XElement xe = new XElement("mo", ";_amp_;InvisibleTimes) и восстановите его, когда получите строку XML: output = xe.ToString().Replace(";_amp_;", "&")

0 голосов
/ 02 апреля 2009

Я думаю, вам понадобится DTD для определения & InvisibleTimes; .

MathML 2.0 предоставляет DTD XHTML + MathML.

0 голосов
/ 02 апреля 2009

Возможно, вам понадобится кодировать имена в формате XML, потому что '&' - это специальный символ.

Так что вместо

XElement xe = new XElement("mo", "&InvisibleTimes");

попробовать

XElement xe = new XElement("mo", "&amp;InvisibleTimes");
0 голосов
/ 02 апреля 2009

Я не знаю о XDocument, но вы можете сделать это с 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;
...