我正在使用新的System.Xml.Linq来创建HTML文档(是的,我知道HtmlDocument,但更喜欢XDocument / XElement类)。我在插入
(或任何其他HTML实体)时遇到问题。我已经尝试过了:
直接放入文字不起作用,因为&变得int&amp ;.
new XElement("h1", "Text to keep together.");
我尝试使用以下内容解析原始XML,但是barfs出现此错误:
XElement.Parse( “文本到一起保持。”);
- >参考未申报的实体'nbsp'。
尝试第三个如下所示。如果我保存到文件中,只有一个空格, 
会丢失。
var X = new XDocument(new XElement("Name", KeepTogether("Hi Mom!")));
private static XNode KeepTogether(string p)`
{
return XElement.Parse("<xml>" + p.Replace(" ", " ") + "</xml>").FirstNode;
}
我找不到一种方法只是将原始文本推过去而不会被转义。我错过了一些明显的东西吗?
答案 0 :(得分:15)
我找不到一种方法只是将原始文本推过去而不会被转义。
只需将Unicode字符放入&amp; nbsp;直接在文本节点中引用(U + 00A0 NO-BREAK SPACE),然后让串行器担心它是否需要转义到&amp;#160;或不。 (可能不是:如果您使用UTF-8或ISO-8859-1作为页面编码,则可以直接包含该字符,而无需担心将其编码为实体引用或字符引用)。
new XElement("h1", "Text\u00A0to\u00A0keep\u00A0together");
答案 1 :(得分:2)
更换&amp;用## AMP ##这样的标记解决了我的问题。也许不是最漂亮的解决方案,但我在10分钟内为客户做了一个演示,所以......我不在乎:)。
这个想法的主题
答案 2 :(得分:2)
我知道这已经老了,但我找到了一些东西而且我很惊讶!
XElement element = new XElement("name",new XCData("<br /> & etc"));
你去吧! CDATA文本!
答案 3 :(得分:1)
您也可以尝试使用编号实体,他们不需要声明。 与指定实体等同的编号实体&amp; nbsp;是&amp;#160;
答案 4 :(得分:1)
与amp(&amp;),lt(&lt;)等不同,nbsp不是XML的已知实体,因此您需要声明它。 在XML中,例如&安培; XYZ;被视为实体,解析器将引用其值以生成输出。
// the xml, plz remove '.' within xml
string xml = "<xml>test&.n.b.s.p;test</xml>";
// declare nbsp as xml entity and its value is " " in this case.
string declareEntity = "<!DOCTYPE xml [<!ENTITY nbsp \" \">]>";
XElement x = XElement.Parse( declareEntity + xml );
// output with a space between tests
// <xml>test test</xml>
或
// plz remove '.' in the string
XElement.Parse("<xml>" + HttpUtility.HtmlEncode("Text&.n.b.s.p;keep everything") + "</xml>");
答案 5 :(得分:1)
如果您将字符复制到其他位置,则可以粘贴该字符。 Viusal工作室允许这样做。 虽然如果你需要这很难做到,但如果你需要任何符号就很容易,例如:
&amp; bull ...只需粘贴•
&安培;哈尔; ...只需粘贴↔
答案 6 :(得分:0)
&nbsp;
答案 7 :(得分:0)
我想出了适合我的这种略显愚蠢的方法: 字符串替换所有&amp;使用## AMP ##存储数据时.... 并在输出上反转该操作。 我将它与XElement SQL列结合使用并进行处理。
此致
尼尔