2013-10-01 68 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(); 
    }