簡體   English   中英

DataContractSerializer序列化到特定的xml節點

[英]DataContractSerializer serialize to specific xml node

我想提供一種在應用程序中保存工作的方法。 這是一種項目功能。 這些項目需要序列化為XML。 我有DataContractSerializer生成XML,但是我需要能夠在XML文件中選擇一個位置進行序列化,而不是自己編寫一個完整的文件,因為將有多個項目,而且我需要能夠從Projects XML文件分別對這些項目進行反序列化/序列化。

我想要XML:

<Projects>
    <Project>
        <ID>...</ID>
        <Name>...</Name>
        <LastEdited>...</LastEdited>
        ...
    </Project>
    <Project>...</Project>
    <Project>...</Project>
</Projects>

然后,我將使用Linq to XML導航文檔,基於Project ID進行序列化和反序列化。

有什么建議么? 提前非常感謝。

找到了一種方法。 它有障礙,但是一旦您包含了所有內容,它就會非常順利地工作。

生成XML:

DataContractSerializer ser = new DataContractSerializer(typeof(Project));
StringBuilder objectSB = new StringBuilder();
XmlWriter objectWriter = XmlWriter.Create(objectSB);
//I'm using this method in the object I want to serialize (hence the 'this')
ser.WriteObject(objectWriter, this);
objectWriter.Flush();

然后,您可以使用以下命令將StringBuilder變成用於Linq to XML的XElement:

Xelement xProject = Xelement.Parse(objectSB.ToString());

對於反序列化:

DataContractSerializer ser = new DataContractSerializer(typeof(Project));
Project project = (CoilProject)ser.ReadObject(xProject.CreateReader());

有幾次,我使用Linq to XML編輯XML而不進行反序列化和重新序列化。 由於DataContractSerializer添加的名稱空間,因此有必要:

//place this somewhere in your project's namespace
public static class MyExtensions
{
    public static IEnumerable<XElement> ElementsAnyNS(this XElement source, string localName)
    {
        return source.Elements().Where(e => e.Name.LocalName == localName);
    }

    public static XElement ElementAnyNS(this XElement source, string localName)
    {
        return source.Elements().Where(e => e.Name.LocalName == localName).Select(e => e).Single();
    }
}

這些擴展方法使您可以從序列化的對象中選擇一個或多個元素,而不必擔心名稱空間。 我從Pavel Minaev關於忽略LINQ to XML的命名空間 的答案中修改了這些擴展方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM