目前有这样的一个XML的schema,说白了就是一个完整的数据库,请问我该怎么样才能对其进行操作(删除,添加,复制,修改)
因为里面有ForgienKey,所以在删除时,得把关联的所有的键值删除,而复制的话,又要把主键的值和被复制的不一样,就是把整个结构数据复制下来,但是所有的PrimaryKey的值要相应的改变,请问该怎么去实现?具体的XML文件请看附件
<?xml version="1.0" standalone="yes"?>
<IdBuilderDataSet xmlns="http://tempuri.org/IdBuilderDataSet.xsd">
  <xs:schema id="IdBuilderDataSet" targetNamespace="http://tempuri.org/IdBuilderDataSet.xsd" xmlns:mstns="http://tempuri.org/IdBuilderDataSet.xsd" xmlns="http://tempuri.org/IdBuilderDataSet.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
    <xs:element name="IdBuilderDataSet" msdata:IsDataSet="true">
      <xs:complexType>
        <xs:choice maxOccurs="unbounded">
          <xs:element name="Settings">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Identifier" type="xs:string" />
                <xs:element name="Name" type="xs:string" minOccurs="0" />
                <xs:element name="Value" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="CodeDefinitions">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Identifier" type="xs:string" />
                <xs:element name="Name" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="Codes">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Identifier" type="xs:string" />
                <xs:element name="Name" type="xs:string" minOccurs="0" />
                <xs:element name="Index" type="xs:int" minOccurs="0" />
                <xs:element name="IsTemplate" type="xs:boolean" minOccurs="0" />
                <xs:element name="CodeDefinitionIdentifier" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="CodeParts">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Identifier" type="xs:string" />
                <xs:element name="Index" type="xs:int" minOccurs="0" />
                <xs:element name="Value" type="xs:string" minOccurs="0" />
                <xs:element name="Type" type="xs:int" minOccurs="0" />
                <xs:element name="MinSize" type="xs:int" minOccurs="0" />
                <xs:element name="CodeIdentifier" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="Counters">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Identifier" type="xs:string" />
                <xs:element name="Ref" type="xs:int" minOccurs="0" />
                <xs:element name="Type" type="xs:int" minOccurs="0" />
                <xs:element name="Quantity" type="xs:int" minOccurs="0" />
                <xs:element name="Source" type="xs:string" minOccurs="0" />
                <xs:element name="SourceArgument" type="xs:string" minOccurs="0" />
                <xs:element name="CodeDefinitionIdentifier" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
      <xs:unique name="PK_Settings" msdata:PrimaryKey="true">
        <xs:selector xpath=".//mstns:Settings" />
        <xs:field xpath="mstns:Identifier" />
      </xs:unique>
      <xs:unique name="PK_CodeDefinitions" msdata:PrimaryKey="true">
        <xs:selector xpath=".//mstns:CodeDefinitions" />
        <xs:field xpath="mstns:Identifier" />
      </xs:unique>
      <xs:unique name="PK_Codes" msdata:PrimaryKey="true">
        <xs:selector xpath=".//mstns:Codes" />
        <xs:field xpath="mstns:Identifier" />
      </xs:unique>
      <xs:unique name="PK_CodeParts" msdata:PrimaryKey="true">
        <xs:selector xpath=".//mstns:CodeParts" />
        <xs:field xpath="mstns:Identifier" />
      </xs:unique>
      <xs:unique name="PK_Counters" msdata:PrimaryKey="true">
        <xs:selector xpath=".//mstns:Counters" />
        <xs:field xpath="mstns:Identifier" />
      </xs:unique>
      <xs:keyref name="Rel_CodeDefinition_Counters" refer="PK_CodeDefinitions">
        <xs:selector xpath=".//mstns:Counters" />
        <xs:field xpath="mstns:CodeDefinitionIdentifier" />
      </xs:keyref>
      <xs:keyref name="Rel_Code_CodeParts" refer="PK_Codes">
        <xs:selector xpath=".//mstns:CodeParts" />
        <xs:field xpath="mstns:CodeIdentifier" />
      </xs:keyref>
      <xs:keyref name="Rel_CodeDefinition_Codes" refer="PK_CodeDefinitions">
        <xs:selector xpath=".//mstns:Codes" />
        <xs:field xpath="mstns:CodeDefinitionIdentifier" />
      </xs:keyref>
    </xs:element>
  </xs:schema>

解决方案 »

  1.   

    要遵循原有的数据约束,只是简单的操作Xml文件是不行的,Xml只是文本,没有验证约束的能力,最好的方法是把Xml读入一个DataSet,DataSet可以完整地保留XML的约束,在DataSet里面操作数据,最后再写回Xml文件即可.给你个简单的示例:          DataSet set = new DataSet();
                set.EnforceConstraints = true;  //确保遵循约束规则,true是默认的
                set.ReadXml(@"C:\04104834348.xml", XmlReadMode.ReadSchema);            //假设你要删除CodeParts表的一个主键值为f438db69-788f-4cc7-9b68-841cebf033ec的一行
                DataTable codeParts = set.Tables["CodeParts"];
                DataRow row = codeParts.Rows.Find("f438db69-788f-4cc7-9b68-841cebf033ec");
                if (row != null)
                {
                    row.Delete();
                    set.AcceptChanges();
                }
                //其他的你需要的数据操作.....
                //最后把DataSet再写为XML文件,覆盖原来的文件就可以了
                set.WriteXml(@"C:\04104834348.xml", XmlWriteMode.WriteSchema);
      

  2.   

    如何判别删除ForgienKey和PrimaryKey的区别呢?