【问题标题】:read line and keep spaces from xml file从 xml 文件中读取行并保留空格
【发布时间】:2014-09-10 20:10:52
【问题描述】:

我正在尝试在 xml 文件中写入一些我创建的配置文件,这些配置文件非常好,

输入字符串是 ProfilesList(0) = "45 65 67" ProfilesList(1) = "个人资料名称";

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&#xA; profilename&#xA;

到目前为止一切顺利,当我尝试从 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 个人资料名称 "

和班级:

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

【问题讨论】:

  • 这不是正常的行为,因为您要返回一个 List 如果您要返回一个字符串 [] 会发生什么情况,那么您是否只能获得 2 个项目而不是 4 个项目,您是否可以不使用 Join() 方法
  • 是的,但我希望得到一个长度为 2 而不是 4 的列表
  • dbc 我编辑了请看@dbc
  • 向我们展示一些 XML 怎么样?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# xml xml-parsing


【解决方案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\" />

在这种情况下,我通过序列化和反序列化为字符串而不是文件来测试代码。然后是助手:

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);
    }
}

【讨论】:

  • 简短,总结,简单的答案@dbc,非常感谢!
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多