2013-10-01 25 views
2

我尝试解析以下Java资源文件 - 这是一个XML文件。 我解析使用C#和XDocument工具,所以这里不是Java的问题。如何获取XElement内部文本的非转义长度?

<?xml version="1.0" encoding="utf-8"?> 
    <resources> 
    <string name="problem">&#160;test&#160;</string> 
    <string name="no_problem"> test </string> 
    </resources> 

的问题是,XDocument.Load(字符串路径)方法加载这个为具有2个相同的XElements一个XDocument。

我加载文件。

string filePath = @"c:\res.xml"; // whatever 
var xDocument = XDocument.Load(filePath); 

当我解析XDocument对象时,这是问题所在。

foreach (var node in xDocument.Root.Nodes()) 
{ 
    if (node.NodeType == XmlNodeType.Element) 
    { 
     var xElement = node as XElement; 
     if (xElement != null) // just to be sure 
     { 
      var elementText = xElement.Value; 
      Console.WriteLine("Text = '{0}', Length = {1}", 
       elementText, elementText.Length); 
     } 
    } 
} 

这将产生以下2行:

"Text = ' test ', Length = 6" 
"Text = ' test ', Length = 6" 

我希望得到以下两行:

"Text = ' test ', Length = 6" 
"Text = '&#160;test&#160;', Length = 16" 

文档编码是UTF8,如果这是相关莫名其妙。

+0

你将如何使用它?因为你收到2个不同的字符串。一种是与常规的空间(32),另一种是不换行空间(160) –

+0

梅德,收到2个相同字符串!我想收到2个不同的字符串! –

+0

复制到http://stackoverflow.com/questions/8512094/how-do-i-preserve-all-xml-formatting-with-xdocument – Regu

回答

1
string filePath = @"c:\res.xml"; // whatever 
var xDocument = XDocument.Load(filePath); 
String one = (xDocument.Root.Nodes().ElementAt(0) as XElement).Value;//<test> 
String two = (xDocument.Root.Nodes().ElementAt(1) as XElement).Value;//<test> 
Console.WriteLine(one == two); //false 
Console.WriteLine(String.Format("{0} {1}", (int)one[0], (int)two[0]));//160 32 

你有两个不同的字符串,&#160;是存在的,但在Unicode格式。 一个可能的办法让一切恢复是手动替换非换空间"&#160;"

String result = one.Replace(((char) 160).ToString(), "&#160;"); 
1

由于梅德按照他的建议,我已经做了功能,使东西工作的统一代码列表。

private static readonly List<int> UnicodeCharCodesReplace = 
     new List<int>() { 160 }; // put integers here 

    public static string UnicodeUnescape(this string input) 
    { 
     var chars = input.ToCharArray(); 

     var sb = new StringBuilder(); 

     foreach (var c in chars) 
     { 
      if (UnicodeCharCodesReplace.Contains(c)) 
      { 
       // Append &#code; instead of character 
       sb.Append("&#"); 
       sb.Append(((int) c).ToString()); 
       sb.Append(";"); 
      } 
      else 
      { 
       // Append character itself 
       sb.Append(c); 
      } 
     } 

     return sb.ToString(); 
    }