我有一个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值中。
答案 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进行规范化,以保证正确的功能。
希望这有帮助,