2015-06-10 47 views
0

因此,我正在開發一個應用程序,我希望能夠動態地解析xml文件,獲取屬性並填充基於哪些元素存在於xml文件。然後可以編輯這些值並將其寫回到最初打開的xml文件中。c動態XML解析,數據存儲和表單#

我已經能夠解析,將值保存到數據庫,填充表單,並通過硬編碼寫回原始的xml文件,我想我有一個動態的「數據庫」結構(字典其中鍵是一個節點的名稱,如果我想存儲節點的子節點信息,那麼該值是一個字典,或者如果我位於元素的最遠嵌套子節點中,則爲字符串)。

我被困在如何獲取我需要的信息以及如何將它存儲在我已經想到的「數據庫」結構中。我已經完成了研究並看到有人使用「動態」對象和linq。但是我看到的所有東西似乎都涉及到在運行之前知道他們需要的路徑名。關於我應該如何解析文件和抓取數據的任何想法,首先?我認爲,如果我能弄清楚,其餘的應該適用。

說我有這個XML

<users> <user1 age="43">John Doe</user1> <user2 age="40">Jane Doe</user2> </users>

一個例子數據庫設置看起來像Dictionary<users, Dictionary<user1, Dictionary<name,John Doe>

在那裏你可以去Key("users").Key("user1").Key("name").Value讓李四或類似的東西。

我的數據庫設置任何其他建議也將被讚賞

+0

我會看看xml序列化。這是在我腦海裏進行xml解析的最簡單和最有效的方法。 https://msdn.microsoft.com/en-us/library/58a18dwa%28v=vs.110%29。aspx – mac

+0

爲什麼你有單獨的標籤定義(user1和user2)看起來像是同一個元素?如果你需要指定用戶標識''user id =「1」age =「43」> John Doe'會更習慣。 –

+0

我想我是這樣做的,因爲我的標籤名稱是嵌入字典行中的關鍵字,並且有多個用戶,所以我的關鍵名稱不會是唯一的。 –

回答

0

你可以使用的XmlDocument類解析XML。解析後,您可以遍歷並顯示在UI中的節點樹。我不明白爲什麼要將XML保存爲數據庫中值的不同記錄,只需將其保存爲文本即可。無論如何,爲了保存xml,你應該將它的記錄翻譯回xml。

+0

所以我使用** XmlDocument **方法來解析我的文件,這很好。現在我想用字典存儲我的數據,因爲我希望能夠根據具有相同父節點的數據對窗體上的控件進行分組。我將它用於沒有葉節點名稱相同的文件。但它需要爲兩者工作。通過父元素存儲保存這個「分組」的數據將會是一種有效的方式? –

0

這聽起來像你正在尋找的是XML序列化。你可以做到這一點,但你需要簡化你的XML。而不是編號<user>元素,您將需要使用具有用戶標識值的屬性。例如,您可以使用id屬性。

<users> 
    <user id="1" age="43">John Doe</user> 
    <user id="2" age="40">Jane Doe</user> 
</users> 

一旦你完成了這個,創建一個類,你可以序列化到這個XML。

using System.Xml.Serialization; 

[XmlRoot(ElementName = "users")] 
public class Users : List<User> 
{ 

} 

[XmlType(TypeName = "user")] 
public class User 
{ 
    [XmlAttribute(AttributeName = "id")] 
    public int Id { get; set; } 

    [XmlAttribute(AttributeName = "age")] 
    public int Age { get; set; } 

    [XmlText] 
    public string Name { get; set; } 
} 

然後,您只需從文件加載即可反序列化。

XmlSerializer serializer = new XmlSerializer(typeof(Users)); 
Users users = (Users)serializer.Deserialize(File.OpenRead("XMLFile1.xml")); 

您可以使用LINQ爲Users集合查詢特定用戶。

var user1 = users.Where(u => u.Id == 1) 

修改User對象或添加更多的Users集合,然後序列化將更改保存迴文件。

XmlSerializer serializer = new XmlSerializer(typeof(Users)); 
serializer.Serialize(File.OpenWrite("XMLFile1.xml"), users); 
+0

看起來好像我給出的文件作爲例子,但我需要它能夠在不知道xml中編譯時的數據類型的情況下讀取xml。這不僅適用於只讀取具有「users.xml」格式的文件的靜態應用程序嗎? –

+0

是的,這隻適用於一種格式。爲了處理文件,你必須在編譯時瞭解一些格式。你會知道什麼?也有可能想出一個可以捕捉所有你需要的信息的單一格式嗎?如果這是一個選項,它可能比擁有一堆解析和持久代碼更好。 –

+0

我只知道有一個有子節點的根節點。而已。 –