2011-05-27 97 views
1

我需要验证包含XML数据的字符串,不需要架构验证。我需要做的就是确保XML格式正确并且编码正确。例如,我希望我的代码来识别XML的这段代码无效:验证xml字符串内容,包括使用C#编码

<?xml version="1.0" encoding="utf-8"?> 
<parentNode> Positions1 ’</parentNode> 

XMLDocument使用LoadXML方法不起作用,有没有当我加载上面的代码片段引发的错误。

我知道如何做到这一点,如果内容是在一个XML文件,下面的代码片段显示:

XmlReaderSettings readerSettings = new XmlReaderSettings(); 
readerSettings.ConformanceLevel = ConformanceLevel.Document; 
readerSettings.CheckCharacters = true; 
readerSettings.ValidationType = ValidationType.None; 

xmlReader = XmlReader.Create(xmlFileName, readerSettings); 
XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(xmlReader); 

如此短暂创建一个临时文件写出来我的XML字符串的内容然后创建一个XmlReader实例来读取它,有没有其他选择?如果有人能够指导我以正确的方向解决这个问题,那就值得欣赏了。

+0

为什么该代码段无效? – svick 2011-05-27 21:58:37

+0

这段代码没有什么无效,我只是寻找替代方法将xml数据写入临时文件。 – linusdev 2011-05-30 02:09:35

回答

0

阿希姆,

感谢您详细的答复,我能够最终拿出一个适合我的需求的解决方案。它涉及从'unicode'字符串中抓取字节,然后将字节转换为utf8编码。

 try 
     { 
      byte[] xmlContentInBytes = new System.Text.UnicodeEncoding().GetBytes(xmlContent); 

      System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true); 
      utf8.GetChars(xmlContentInBytes); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      return false; 
     } 
1

你还没有完全理解什么编码方式。如果你在内存中有一个.Net字符串,它不再是“原始数据”,并且没有编码。所以LoadXML ingores有一个很好的理由。所以你想做的事情根本没有意义。但如果你真的想这样做:

你可以将你的字符串转换成内存流,所以你不必写一个临时文件。然后,可以在调用XmlReader.Create时使用该流而不是xmlFileName。

+0

我确实怀疑LoadXML并没有意识到编码,主要是因为它可能是为加载xml片段而设计的。关于为什么我需要这样做的更多背景知识 - 我们接受上传到站点的XML文件以及通过Web服务,此XML数据需要验证。执行以下步骤是否有意义: – linusdev 2011-05-30 02:00:29

+0

执行以下步骤是否有意义:1)通过使用正则表达式查看数据来找出xml数据的编码,2)使用system.text.encoding读取字节[encodingType] .GetBytes,3)将字节写入内存流,4)在调用XmlReader.Create中使用内存流。我有点束缚,因为有很多系统使用给定的XML数据的XMLDocument表示,我正在寻找一种最有效的方式来验证数据而不会破坏所有其他功能。 – linusdev 2011-05-30 02:08:04

+0

你必须得到字符串的二进制表示和字符串的抽象概念之间的区别。从用户的角度来看.Net字符串不再有编码。这只是一个字符串。您想要的解码必须在先前的步骤中进行:HTTP请求具有编码,您必须使用该解码来解码字符串。或者您可以将请求流传递给XDocument。只要你有.Net字符串,解码通常就要晚了。但是在大多数情况下,.Net应该已经为你处理了。 ;-) – Achim 2011-05-30 06:37:16