あなたのxml出力を見て、Save関数の出力が非常に奇妙に構造化されたxmlを作成するため、スキーマの変更を真剣に検討します。これが、再構築に苦労している理由だと思います。現在の出力は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<Group>
<GroupName>
<GroupName>groupName</GroupName>
<Addres xmlns="addy">
<Number xmlns="0123456789">
<Name xmlns="Henry">
<Addres xmlns="address2">
<Number xmlns="9876543210">
<Name xmlns="Dave" />
<GroupName>
<GroupName>secondGroup</GroupName>
<Addres xmlns="fleet">
<Number xmlns="0123456789">
<Name xmlns="Me" />
</Number>
</Addres>
</GroupName>
</Number>
</Addres>
</Name>
</Number>
</Addres>
</GroupName>
</Group>
結果のxmlは処理不能ではなく、以下のメソッドを使用してオブジェクトに読み戻すことができると述べました。Save コードから推測した唯一のことは、文字列から GroupName オブジェクトを取得する何らかの方法があるということです (ToString メソッドを使用して値を xml に取得しているため)。私のテストでは、以下に示すように、暗黙的な変換演算子を使用してオブジェクトを実装しました。
class GroupName
{
public string Name { get; set; }
public override string ToString()
{
return this.Name;
}
// Specific conversion from string to GroupName object
public static implicit operator GroupName(string s)
{
return new GroupName() { Name = s };
}
}
public PhoneBook Rebuild()
{
using (XmlReader reader = XmlReader.Create(path))
{
// read to the start of the xml
reader.MoveToContent();
// create the return object
PhoneBook returnObject = new PhoneBook();
returnObject.Items = new List<PhoneBookGroup>();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
// read each GroupName Node as a separate node collection
if (reader.Name == "GroupName")
{
// This is the root node of the groups
PhoneBookGroup grp = null;
Contact currentContact = null;
// loop the reader from this starting node
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "GroupName":
if (grp == null)
{
grp = new PhoneBookGroup();
returnObject.Items.Add(grp);
// must implement an implicit operator between string and GroupName object
grp.Name = (GroupName)reader.ReadElementString();
}
else
{
// start of a new group, so null what we have so far and start again
grp = null;
}
break;
case "Addres":
// Address is the start node for a contact so create a new contact and start filling it
currentContact = new Contact();
if (grp.Items == null)
{
grp.Items = new List<Contact>();
}
grp.Items.Add(currentContact);
// due to the way the xml is being written the value is held as the namespace !!!
currentContact.Address = reader.NamespaceURI;
break;
case "Number":
// due to the way the xml is being written the value is held as the namespace !!!
currentContact.Phone = reader.NamespaceURI;
break;
case "Name":
// due to the way the xml is being written the value is held as the namespace !!!
currentContact.Name = reader.NamespaceURI;
break;
default:
break;
}
}
}
}
}
}
return returnObject;
}