问题
I want to create a MathML document from an expression tree using Linq to xml, but I cannot figure out how to use the MathML xml entities (such as ⁡ and &InvisibleTimes): When I try to create directly a XElement using
XElement xe = new XElement("mo", "&InvisibleTimes");
it justs escapes the ampersand (which is no good). I also tried to use XElement.Parse
XElement xe = new XElement.Parse("<mo>&InvisibleTimes</mo>");
but it fails with an System.XmlException: Reference to undeclared entity 'InvisibleTimes' How can I declare the entity or ignore the checks?
回答1:
As others have pointed out, there is no direct way to do it.
That said, you can try using the corresponding unicode caracther. According to http://www.w3.org/TR/MathML2/mmlalias.html, for ApplyFunction it is 02061, try new XElement("mo", "\u02061")
回答2:
According to this thread, LINQ to XML doesn't include entity references: it doesn't have any node type for them. It just expands them as it loads a file, and after that you've just got "normal" characters.
回答3:
I don't know about XDocument
, but you can do it with 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;
回答4:
You may need to xml encode the names because '&' is a special character.
So instead of
XElement xe = new XElement("mo", "&InvisibleTimes");
try
XElement xe = new XElement("mo", "&InvisibleTimes");
回答5:
I think you'll need a DTD to define <mo>⁢</mo>.
MathML 2.0 provides an XHTML + MathML DTD.
回答6:
A workaround is to use any placeholder for the & such as ;_amp_;
XElement xe = new XElement("mo", ";_amp_;InvisibleTimes)
and restore it when you get the xml string:
output = xe.ToString().Replace(";_amp_;", "&")
来源:https://stackoverflow.com/questions/707062/linq-to-xml-and-custom-xml-entities