2013-11-15 54 views
0

我有一個XML,我需要更新每個組的CRC值。我編寫例程來計算值,但不知道讀取XML的最佳方式是什麼,解析每個部分,然後更新CRC值。C#更新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的值。

+0

我希望只是元素的內容,而不是序列化形式。否則,你必須考慮Canonicalization。 –

+0

需要整行而不僅僅是內容 – Craig

回答

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())); 
     }); 

但計算CRC的序列化XML時要十分小心。

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

是相同的XML作爲

<SomeElement b="World" a="Hello" /> 

但將產生當然不同的CRC值。

您需要在序列化之前規範您的XML以保證正確的功能。

希望這有助於

+0

太棒了!謝謝 – Craig