English 中文(简体)
在解析为XElement之前,如何替换字符串中的所有&、<、>?
原标题:How to replace all &, <, > in string before parsing to XElement?

我有这样的绳子

"<root><text>My test is > & < </text></root>"

实际上这是正确的xml,除了&<>;符号。

我需要将其转换为<;根>&书信电报;文本>;我的测试是&;gt&;amp&;lt</文本></根>,然后用XElement进行转换。解析(str);

如何进行此转换?

最佳回答

这几乎是不可能可靠实现的。你应该从源头上纠正这个问题。如果您控制插入“我的测试是>;&;<;”字符串的系统,则应在插入该字符串之前对其进行转义。<code>HttpUtility。HtmlEncode是一种合理的方法。

问题回答

如果使用new XElement而不是XElement,XElement将自动转义文本。解析()

LINQPad片段:

var str = "<root><text>My test is > & < </text></root>";
var element = new XElement("element", str);
element.Dump();

输出

<element>&lt;root&gt;&lt;text&gt;My test is &gt; &amp; &lt; &lt;/text&gt;&lt;/root&gt;</element>

edit:我重读了这个问题,并意识到这并不能产生所需的输出。

您遇到的问题是,传入的XML字符串根本无效。如果你能控制源,那么你应该在那里修复它。如果没有,就没有简单的方法来解决它。

不要用用户文本替换变量(这是XML注入错误,不安全)。用转义文本替换它们。这里有一个XML转义函数:http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx一

这就像你用HTML做的一样。

这是“除了xyz之外的XML”的想法可能需要更仔细地研究。为了正确地解决这个问题,您需要为您称之为“除xyz之外的XML”的语言定义一个语法,然后您需要编写一个解析器来分析符合该语法的文档;该解析器的输出可以是输入的XML表示。这一切都是可行的。不容易,但可行。当然,使用像XML这样的标准的好处是,您可以获得现成的解析器,而如果您发明了自己的语法,则必须编写自己的解析器。

为您的语言编写一个好的解析器是非常耗时的,尤其是因为需要大量的测试。编写一个测试糟糕的糟糕解析器可能很容易,而这正是许多糟糕的程序员所要做的。在这种情况下,一个好的软件工程师会意识到遵守标准的好处。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签