2016-05-14 137 views
0

对于C#中的代码,我使用XPathDocument将字符串解析为XML。C#XPathDocument将字符串解析为包含BOM的XML

该字符串是从SDL Trados Studio中检索的,它取决于正在处理的XML(它最初是如何创建和加载以进行翻译的),但有时该字符串有时不是BOM

编辑:'xml'实际上是从源文本和目标文本以及结构元素的片段中分析出来的。文本元素转义为xml,标记和文本加入一个string。因此,如果标记在xliff中有BOM,那么该字符串将具有BOM。

我想实际解析任何xmls,独立于编码。所以此时我的解决方案是用Substring删除BOM。

这里是我的代码:

//Recreate XML files (extractor returns two string arrays) 
string strSourceXML = String.Join("", extractor.TextSrc); 
string strTargetXML = String.Join("", extractor.TextTgt); 

//strip BOM 
strSourceXML = strSourceXML.Substring(strSourceXML.IndexOf("<?")); 
strTargetXML = strTargetXML.Substring(strSourceXML.IndexOf("<?")); 

//Transform XML with the preview XSL 
var xSourceDoc = new XPathDocument(strSourceXML); 
var xTargetDoc = new XPathDocument(strTargetXML); 

...我已经寻找一个更好的解决方案,通过几篇文章,如这些,但是我发现没有更好的解决办法尚未:

任何意见,更优雅的解决这个问题?

+0

也许硫帮助:http://stackoverflow.com/questions/3104158/xmlreader-breaks-on-utf-8-bom –

+0

用记事本打开文件。启动记事本,然后使用菜单文件:打开浏览文件。当您单击文件名时,请检查NotePad浏览器中文件的编码。如果编码不是UTF8,请打开文件,然后使用UTF8保存。 – jdweng

+0

@jdweng你的意思是我应该通过记事本自动化我的字符串?看起来并不简单... – ib11

回答

1

XPathDocument的构造函数采用String自变量https://msdn.microsoft.com/en-us/library/te0h7f95%28v=vs.110%29.aspx将URI与XML文件位置一起使用。如果您有一个带有XML标记的字符串,则在该字符串上使用StringReader,例如

XPathDocument xSourceDoc; 
using (TextReader tr = new StringReader(strSourceXML)) 
{ 
    xSourceDoc = new XPathDocument(tr); 
} 
+1

是的,但那是我的字符串有BOM的问题。所以我正在寻找解决方法。实际上,它是一种识别物料清单的现有方法,所以我不必采用'Substring'的野蛮方式。 – ib11