2014-09-10 39 views
2

我想在XML編寫的文件,我創建到目前爲止好一些資料,讀取線和保持空間

輸入字符串爲ProfilesList(0)=「45 65 67」 ProfilesList(1 )=「p​​rofilename」;

public void CreateGroupXML(String GroupNameWithPath, List<String> ProfilesList) 
{ 
     ProfilesGroup.ProfilesList = ProfilesList; 

     XmlWriterSettings ws = new XmlWriterSettings(); 
     ws.NewLineHandling = NewLineHandling.Entitize; 
     for (int i = 0; i < ProfilesList.Count; i++) 
     { 
      ProfilesList[i] += Environment.NewLine; 
     } 


     XmlSerializer serializer = new XmlSerializer(typeof(ProfilesGroup)); 
     using (XmlWriter wr = XmlWriter.Create(GroupNameWithPath, ws)) 
     { 
      serializer.Serialize(wr, ProfilesGroup); 
     } 

    } 

} 
在XML

文件中的配置文件寫的是: ProfilesList =「45 65 67 PROFILENAME

到目前爲止好,當我試圖從XML文件 它拆分閱讀問題發生第一個配置文件名稱到3 這裏的代碼

public List<string> getProfilesOfGroup(string groupNameFullPath) 
    { 
     Stream stream = null; 
     try 
     { 
      stream = File.OpenRead(groupNameFullPath); 
      XmlSerializer serializer = new XmlSerializer(typeof(ProfilesGroup)); 
      _ProfilesGroup = (ProfilesGroup)serializer.Deserialize(stream); 
      stream.Close(); 
      return _ProfilesGroup.ProfilesList; 
     } 
     catch (Exception Ex) 
     { 
      log.ErrorFormat("Exception in getProfilesOfGroup: {0}", Ex.Message); 
      if (stream != null) 
      { 
       stream.Close(); 
      } 
      return null; 
     } 
    } 

the output (lets call the string ProfileList) contains : 
ProfileList(0) = 45 
ProfileList(1) = 65 
ProfileList(2) = 67 
ProfileList(3) = profilename 

and i expecting the string to contain 
ProfileList(0) = 45 65 67 
ProfileList(1) = profilename 

編輯在這裏完整的XML:

?xml version =「1.0」encoding =「utf-8」?ProfilesGroup xmlns:xsi =「http://www.w3.org/2001/XMLSchema-instance」xmlns:xsd =「http:// www .w3.org/2001/XMLSchema的」 ProfilesList = 「45 65 67 PROFILENAME 」

和類:

[XmlRootAttribute("VProfilesGroup", IsNullable = false, DataType = "", Namespace = "")] 
public class ProfilesGroup 
{ 
    [XmlAttribute("ProfilesList")] 
    public List<String> ProfilesList = new List<string>(); 
} 
+0

不正常的行爲,因爲你是返回一個列表,如果你要返回一個字符串[]你會那麼只能獲得2項對4你能不能用一個加入會發生什麼( )方法 – MethodMan 2014-09-10 20:16:54

+0

是的,但我不贊同獲得列表2的lenegth而不是4 – Zlex 2014-09-10 20:28:31

+0

dbc我編輯請看看@dbc – Zlex 2014-09-10 20:38:07

回答

1

爲什麼不直接刪除[XmlAttribute("ProfilesList")]屬性?您的數據將被成功序列化和反序列化。 XML將如下所示:

<VProfilesGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ProfilesList> 
     <string>45 65 67</string> 
     <string>profilename</string> 
    </ProfilesList> 
</VProfilesGroup> 

在此格式中,字符串列表明確定義爲有兩個條目。這是串行化的標準方法&將序列化爲XmlSerializer的字符串數組。或者您是否有一些外部約束使您將列表聲明爲屬性?

更新

如果必須序列化ProfilesList作爲屬性不元件的陣列,可以手動構建和解構串像這樣:

[XmlRootAttribute("VProfilesGroup", IsNullable = false, DataType = "", Namespace = "")] 
public class ProfilesGroup 
{ 
    static readonly char Delimiter = '\n'; 

    [XmlIgnore] 
    public List<String> ProfilesList { get; set; } // Enhance the setter to throw an exception if any string contains the delimiter. 

    [XmlAttribute("ProfilesList")] 
    [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    public string ProfilesListText 
    { 
     get 
     { 
      return string.Join(Delimiter.ToString(), ProfilesList.ToArray()); 
     } 
     set 
     { 
      ProfilesList = new List<string>(value.Split(Delimiter)); 
     } 
    } 

    public static string CreateGroupXML(List<String> ProfilesList) 
    { 
     var group = new ProfilesGroup(); 
     group.ProfilesList = ProfilesList; 
     return XmlSerializationHelper.GetXml(group); 
    } 

    public static List<string> GetProfilesOfGroup(string xml) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(ProfilesGroup)); 
     var group = (ProfilesGroup)serializer.Deserialize(new StringReader(xml)); 
     return group == null ? null : group.ProfilesList; 
    } 

    public static void Test() 
    { 
     List<string> list = new List<string>(new string[] { "45 65 67", "profilename" }); 
     var xml = CreateGroupXML(list); 
     var newList = GetProfilesOfGroup(xml); 
     bool same = list.SequenceEqual(newList); 
     Debug.Assert(same); // No assert. 
    } 
} 

生成的XML看起來像:

<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<VProfilesGroup xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ProfilesList=\"45 65 67&#xA;profilename\" /> 

在這種情況下,我通過序列化和deseria測試代碼指向一個字符串而不是一個文件。然後助手:

public static class XmlSerializationHelper 
{ 
    public static string GetXml<T>(T obj, XmlSerializer serializer) where T : class 
    { 
     using (var textWriter = new StringWriter()) 
     { 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true;  // For cosmetic purposes. 
      settings.IndentChars = " "; // The indentation used in the test string. 
      using (var xmlWriter = XmlWriter.Create(textWriter, settings)) 
      { 
       serializer.Serialize(xmlWriter, obj); 
      } 
      return textWriter.ToString(); 
     } 
    } 

    public static string GetXml<T>(T obj) where T : class 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 
     return GetXml(obj, serializer); 
    } 
} 
+0

總之,簡單的回答@dbc,謝謝這麼多! – Zlex 2014-09-10 21:45:24

+0

@ user3278650 - 很高興提供幫助。如果問題得到解答,請[標記爲這樣](謝謝!)(http://meta.stackexchange.com/questions/147531/how-mark-my-question-as-answered-on-stackoverflow),謝謝! – dbc 2014-09-10 21:55:50