C#更新XML文件中的CRC值

时间:2013-11-15 17:20:59

标签: c# xml

我有一个XML,我需要更新每个组的CRC值。我编写了例程来计算值,但不确定读取XML的最佳方法是什么,解析每个部分然后更新CRC值。

这是XML文件的示例 -

<?xml version="1.0" encoding="UTF-8"?>
<!-- This XML file was generated by Protocol Editor -->
<!-- The Group Names are ignored by the Assay Algorithms, but could have a useful meaning for users. -->
<protocols xsi:noNamespaceSchemaLocation="GENII_protocols.UTF08.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<assay_protocol   carttype="1"  name="Calibration"  CRC32="F3C2D665">
    <group name="ChannelsMap" channel="CONSTANTS">
        <parameter name="outerProximal" value="0"/>
        <parameter name="innerProximal" value="1"/>
        <parameter name="innerDistal" value="2"/>
        <parameter name="outerDistal" value="3"/>
    </group>
    <group name="AssayIdentity" channel="CONSTANTS">
        <parameter name="AssayName" value="Calibration"/>
        <parameter name="AssayType" value="1"/>
    </group>
    <group name="AssaySubSystem" channel="ASSAY">
        <parameter name="FillTimeBuffer" value="8"/>
        <parameter name="AssayTime" value="120"/>
        <parameter name="SampleRate" value="2"/>
    </group>
    <group name="ProfileForGENII" channel="ASSAY">
        <parameter name="MixingWaveAmpCmnd" value="@ao7600FF#"/>
        <parameter name="MixingWaveFormCmnd" value="@AIFF#"/>
        <parameter name="MixingProfileCmnd" value="@AC 5 5 1000 10 64 64 1000 9 31 35 1000 119 FF#"/>
        <parameter name="SamplingProfileCmnd" value="@AE000112233FF#"/>
    </group>
</assay_protocol>
<assay_protocol   carttype="1"  name="Calibration2"  CRC32="F3C2D665">
    <group name="ChannelsMap" channel="CONSTANTS">
        <parameter name="outerProximal" value="0"/>
        <parameter name="innerProximal" value="1"/>
        <parameter name="innerDistal" value="2"/>
        <parameter name="outerDistal" value="3"/>
    </group>
    <group name="AssayIdentity" channel="CONSTANTS">
        <parameter name="AssayName" value="Calibration"/>
        <parameter name="AssayType" value="1"/>
    </group>
    <group name="AssaySubSystem" channel="ASSAY">
        <parameter name="FillTimeBuffer" value="8"/>
        <parameter name="AssayTime" value="120"/>
        <parameter name="SampleRate" value="2"/>
    </group>
    <group name="ProfileForGENII" channel="ASSAY">
        <parameter name="MixingWaveAmpCmnd" value="@ao7600FF#"/>
        <parameter name="MixingWaveFormCmnd" value="@AIFF#"/>
        <parameter name="MixingProfileCmnd" value="@AC 5 5 1000 10 64 64 1000 9 31 35 1000 119 FF#"/>
        <parameter name="SamplingProfileCmnd" value="@AE000112233FF#"/>
    </group>
</assay_protocol>
</protocols>

从相关协议中的每一行计算CRC,然后结果需要放在CRC32值中。

1 个答案:

答案 0 :(得分:2)

这样的事情可以胜任

        XDocument xDoc = XDocument.Load("example.xml");
        var protocols = from protocol in xDoc.Descendants("assay_protocol")
                select protocol;
        protocols.ToList().ForEach((entry) => { var r = entry.CreateReader();
                                                r.MoveToContent();
                                                entry.SetAttributeValue("CRC32", CRC32Function(r.ReadInnerXml()));
        });

但在计算序列化XML的CRC时要非常谨慎。

 <SomElement a="Hello" b="world" />

是一样的xml
 <SomeElement b="World" a="Hello" />

但当然会产生不同的CRC值。

您需要在序列化之前对XML进行规范化,以保证正确的功能。

希望这有帮助,