GVKun编程网logo

在构造使用该数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的十六进制字符?

22

在本文中,我们将带你了解在构造使用该数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的十六进制字符?在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有

在本文中,我们将带你了解在构造使用该数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的十六进制字符?在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的.net – 用XmlDocuments,XSLT或Linq解析Xml,XPath更有效率吗?、C# -- 使用XmlDocument或XDocument创建xml文件、c# – .NET:如何使用XPATH从XMLDocument中删除特定节点?、c# – XPathDocument是否在构造之后使用它构造的内存流?

本文目录一览:

在构造使用该数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的十六进制字符?

在构造使用该数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的十六进制字符?

在XmlReader中使用它之前,是否有任何简单/通用的方法来清理基于XML的数据源,以便我可以正常使用与XML上的十六进制字符限制不符的XML数据?

注意:

  • 该解决方案需要处理使用UTF-8以外的字符编码的XML数据源,例如,通过在XML文档声明中指定字符编码。剥离无效的十六进制字符时不改变源代码的字符编码一直是主要的问题。
  • 删除无效的十六进制字符仅应删除十六进制编码的值,因为您经常会在数据中发现恰好包含一个字符串(该字符串与十六进制字符匹配)的href值。

背景:

我需要使用符合特定格式(例如Atom或RSS提要)的基于XML的数据源,但希望能够使用已发布的数据源(根据XML规范包含无效的十六进制字符)。

在.NET中,如果您有一个表示XML数据源的Stream,然后尝试使用XmlReader和/或XPathDocument对其进行解析,则会由于XML数据中包含无效的十六进制字符而引发异常。我当前解决此问题的尝试是将Stream解析为字符串,并使用正则表达式删除和/或替换无效的十六进制字符,但是我正在寻找一种性能更高的解决方案。

答案1

小编典典

可能并不完美 (由于人们错过了此免责声明,因此添加了重点),但是在此情况下,我的工作如下。您可以调整以与流一起使用。

/// <summary>/// Removes control characters and other non-UTF-8 characters/// </summary>/// <param name="inString">The string to process</param>/// <returns>A string with no control characters or entities above 0x00FD</returns>public static string RemoveTroublesomeCharacters(string inString){    if (inString == null) return null;    StringBuilder newString = new StringBuilder();    char ch;    for (int i = 0; i < inString.Length; i++)    {        ch = inString[i];        // remove any characters outside the valid UTF-8 range as well as all control characters        // except tabs and new lines        //if ((ch < 0x00FD && ch > 0x001F) || ch == ''\t'' || ch == ''\n'' || ch == ''\r'')        //if using .NET version prior to 4, use above logic        if (XmlConvert.IsXmlChar(ch)) //this method is new in .NET 4        {            newString.Append(ch);        }    }    return newString.ToString();}

.net – 用XmlDocuments,XSLT或Linq解析Xml,XPath更有效率吗?

.net – 用XmlDocuments,XSLT或Linq解析Xml,XPath更有效率吗?

我已经解析XML使用以下两种方法…

>使用对象模型和XPath查询解析XmlDocument。
> XSL / T

但我从来没有使用过…

> .Net 3.5的新的Linq Xml对象模型

任何人都可以告诉我三种替代品之间的比较效率?

我意识到,特定的用法将是一个因素,但我只是想一个粗略的想法。例如,Linq选项是否比其他选项更慢?

查询XML文档的绝对最快的方法是最困难的:编写一个方法,使用XmlReader来处理输入流,并在读取它们时使它处理节点。这是将解析和查询合并为单个操作的方式。 (简单地使用XPath不这样做; XmlDocument和XPathDocument都在它们的Load方法中解析文档。)如果你处理极大量的XML数据流,这通常只是一个好主意。

您描述的所有三个方法执行类似。 XSLT有很多空间是最慢的,因为它让你结合XPath的低效率与模板匹配的低效率。 XPath和LINQ查询本质上都是相同的事情,这是通过XML节点的可枚举列表的线性搜索。我希望LINQ在实践中略微更快,因为XPath是在运行时解释,而LINQ在编译时解释。

但是一般来说,如何编写查询将比使用什么技术对执行速度有更大的影响。

针对XML文档编写快速查询的方法是相同的,无论是使用XPath还是LINQ:制定查询,以便尽可能少的节点在执行期间访问。使用哪种技术无关紧要:检查文档中每个节点的查询的运行速度比仅检查其中一小部分的查询慢得多。你做这件事的能力更多取决于XML的结构,比其他任何事情:具有可导航的元素层次结构的文档通常比元素是文档元素的所有子元素的查询要快得多。

编辑:

虽然我很肯定我是对的,查询XML是绝对最快的方式是最难的,真正最快(和最难的)方式不使用XmlReader;它使用直接处理流中的字符的状态机。像使用正则表达式解析XML一样,这通常是一个可怕的想法。但它确实给你选择交换功能的速度。通过决定不处理您的应用程序不需要的那些XML片段(例如命名空间解析,字符实体扩展等),您可以构建一些东西,通过比XmlReader更快的字符流来寻找。我可以想到的应用程序,这甚至不是一个坏主意,虽然我不能想到很多。

C# -- 使用XmlDocument或XDocument创建xml文件

C# -- 使用XmlDocument或XDocument创建xml文件

使用XmlDocument或XDocument创建XML文件

需引用:System.Xml; System.Xml.Linq;

1.使用XmlDocument创建XML(入门案例)

Main( 创建XML XmlDocument xmldoc = XmlDeclaration xmldec = xmldoc.CreateXmlDeclaration(,, 添加根节点 XmlElement rootElement = xmldoc.CreateElement( 添加根节点下的子节点元素 XmlElement classElement = xmldoc.CreateElement( XmlAttribute atrrClass = xmldoc.CreateAttribute( atrrClass.Value = 添加子节点下的元素 XmlElement stuElement = xmldoc.CreateElement( XmlAttribute attrStu = xmldoc.CreateAttribute( attrStu.Value = 文件 xmldoc.Save( Console.WriteLine(文件ok! }

使用XmlDocument创建的xml文件:

2. 使用XDocument创建XML(入门案例)

Main( 创建XML System.Xml.Linq.XDocument xdoc = XDeclaration xdec = XDeclaration(, xdoc.Declaration = 添加根节点 XElement rootEle = XElement( 添加子节点 XElement classEle = XElement( XAttribute attrClass = XAttribute(, 添加子节点下的元素 XElement stuEle = XElement( XAttribute atrStu = XAttribute(, 文件 xdoc.Save( Console.WriteLine(文件ok }

使用XDocument创建的Xml文件:

c# – .NET:如何使用XPATH从XMLDocument中删除特定节点?

c# – .NET:如何使用XPATH从XMLDocument中删除特定节点?

使用C#

如何使用XPATH从XMLDocument中删除特定节点?

解决方法

XPath只能从文档中选择节点,而不能修改文档.

c# – XPathDocument是否在构造之后使用它构造的内存流?

c# – XPathDocument是否在构造之后使用它构造的内存流?

我有这样的代码:
// Take the xml message and turn it into an object
var bytes = Encoding.ASCII.GetBytes(message);
var memoryStream = new MemoryStream(bytes);

XPathDocument xPathDocument = new XPathDocument(memoryStream);

我意识到我不会在任何地方清理MemoryStream.我只是想改变它:

// Take the xml message and turn it into an object
var bytes = Encoding.ASCII.GetBytes(message);
var memoryStream = new MemoryStream(bytes);

XPathDocument xPathDocument;
using(memoryStream)
{
    xPathDocument = new XPathDocument(memoryStream);
}

但是我不确定XPathDocument在构建之后是否在内部使用了MemoryStream. (如果是这样,我需要在完成XPathDocument之后等待并处理它.)

有谁知道我什么时候可以处理这个MemoryStream?

解决方法

不,这是一个很好的改变.将流加载到xml后,您不再需要它.

好吧,我希望它很好,它与我编写的很多代码非常相似. :d

我们今天的关于在构造使用该数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的十六进制字符?的分享已经告一段落,感谢您的关注,如果您想了解更多关于.net – 用XmlDocuments,XSLT或Linq解析Xml,XPath更有效率吗?、C# -- 使用XmlDocument或XDocument创建xml文件、c# – .NET:如何使用XPATH从XMLDocument中删除特定节点?、c# – XPathDocument是否在构造之后使用它构造的内存流?的相关信息,请在本站查询。

本文标签:

上一篇XML可序列化可序列化对象的通用列表(可序列化的类)

下一篇通过XSLT以XML格式格式化日期