如何在单个XML文件中由多个用户同时更新不同的XML元素?

时间:2013-01-28 07:44:53

标签: c# xml

我有一个XML文件:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"                                     <xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
 <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
  <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="UsersPreferenceSettingsDT">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="USERPROFILEID" type="xs:int" minOccurs="0" />
            <xs:element name="SCREENAMEID" type="xs:int" minOccurs="0" />
            <xs:element name="FREEZEDCOLUMNID" type="xs:string" minOccurs="0" />
            <xs:element name="ORDEROFCOLUMNS" type="xs:string" minOccurs="0" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
</xs:element>
</xs:schema>
<UsersPreferenceSettingsDT>
  <USERPROFILEID>219</USERPROFILEID>
  <SCREENAMEID>1</SCREENAMEID>
  <FREEZEDCOLUMNID>2|3|4|5</FREEZEDCOLUMNID>
  <ORDEROFCOLUMNS>1</ORDEROFCOLUMNS>
</UsersPreferenceSettingsDT>
<UsersPreferenceSettingsDT>
  <USERPROFILEID>123</USERPROFILEID>
  <SCREENAMEID></SCREENAMEID>
  <FREEZEDCOLUMNID>s|s|s</FREEZEDCOLUMNID>
  <ORDEROFCOLUMNS></ORDEROFCOLUMNS>
</UsersPreferenceSettingsDT>
</NewDataSet>

因为我必须更新XML元素(i,e USERPROFILeID = 219,USERPROFILEID是唯一的)。同时,另一个用户也更新相同的XML文件但不同的XML元素(i,e USERPROFILEID = 123)。 XML如何反映用户XML更新(如SQL或ORACLE DB Update)。我使用以下代码进行更新。

userPreferenceSettingsDS.WriteXml(userPreferenceSettingsXMLFilePath, XmlWriteMode.WriteSchema);

但它仅反映最后一次用户配置文件更新值,而多个用户同时更新XML。有谁引导我走出这些问题?

4 个答案:

答案 0 :(得分:1)

好吧,因为我们正在讨论的是xml文件而不是数据库,所以除非你总是从文件加载而不是从内存加载,否则你将无法获得数据的“最新”版本,但即使这样你也暴露自己并发问题。

这里最好的选择是切换到数据库,或者实现类似于为所有用户提供服务的Singleton Repository,这样你就会总是返回xml中数据的最新值。

它会解决您的其他问题,当您写入文件时,您将编写包含多个用户更改的数据的“合并”版本。


XML作为数据库的资源:

http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/346a2816-faae-461d-aaa8-235d9c0dd55c

XML Database in C#.net

http://bytes.com/topic/c-sharp/answers/460625-c-pure-xml-database

答案 1 :(得分:0)

或者每个用户使用一个配置文件。

答案 2 :(得分:0)

您需要确保一次只能进行一次保存操作。

为此,您需要提供一个读取和写入文件的静态(共享)类。这个花哨的新流行语是Singleton实例,但它只是以下内容:

public static class MyXMLAccessor
{
    public static void saveTheData()
    {
        //this method would write the data to the XML file and save it.
    }

    public static string ReadTheData()
    {
        //to read the data from the file
    }
}

这样,您可以保证在下一个操作开始之前保存一个操作的结果。

更复杂的解决方案是将xml读入应用程序范围数据集,以便它可以像数据库一样工作。然后,您将使用DataSet.ToXML()方法定期将数据集的内容写回文件。

答案 3 :(得分:0)

听起来好像你应该使用XML数据库。您越早采取行动,您将从中获得的利益越多,您花在创建自己不适当的本土解决方案上的花费就越少。