解析する必要がある次の XML ドキュメントがあります。
...
<tx size_total="143">
<type size="1" start_key="02">STX</type>
<type size="3">Type</type>
<type size="3" decimal="true">Serial</type>
<type size="3" key="23 64 31">Function_Code</type>
<type size="2" decimal="true">LIU</type>
<type size="1">Status</type>
<type size="2" repeat="64" binary ="true" binary_discard="2">Value</type>
<type size="1">ETX</type>
<type size="1">LRC</type>
...
解析用に次のコードを書きました。
XmlNodeList typeNodeList = txNode.SelectNodes(TYPE_NODE);
CommRuleContainer rc = new CommRuleContainer(funcNode.Attributes.GetNamedItem("name").Value,
txNode.Attributes.GetNamedItem("size_total").Value, funcNode.Attributes.GetNamedItem("id").Value);
foreach (XmlNode tNode in typeNodeList)
{
int size = Convert.ToInt32(tNode.Attributes.GetNamedItem("size").Value);
int repeat = Convert.ToInt32(tNode.Attributes.GetNamedItem("repeat").Value);
int binary_discard = Convert.ToInt32(tNode.Attributes.GetNamedItem("binary_discard").Value);
string start_key = tNode.Attributes.GetNamedItem("start_key").Value;
string key = tNode.Attributes.GetNamedItem("key").Value;
bool convert_decimal = false, convert_binary = false;
if (tNode.Attributes.GetNamedItem("decimal").Value == "true")
convert_decimal = true;
if (tNode.Attributes.GetNamedItem("binary").Value == "true")
convert_binary = true;
rc.AddTypeDefinition(tNode.Value, size, repeat, binary_discard, convert_decimal, convert_binary);
}
存在しない特定の属性の値を取得しようとすると、コードは nullreferenceexception をスローします (IE: tNode.Attribute.GetNamedItem("repeat").value は、repeat 属性を持たないすべてのノードで失敗します)。特定の属性が存在するかどうかを確認する方法は?
また、上記のコードはまったくきれいではありません。上記のコードを整理する最良の方法は何ですか?
編集:属性から値を取得する前に、属性がnullかどうかを個別に確認できるアプローチを認識していますが、多くのif(またはネストされたif)を記述する必要があるため、コードが非常に汚く見えます
if (tNode.Attributes.GetNamedItem("decimal") != null)
if (tNode.Attributes.GetNamedItem("decimal").Value == "true")
convert_decimal = true;
より多くの属性を書かなければならない場合、これは長期的には問題になります。このための組織化されたアプローチをもっと知りたいです(おそらくXML属性を列挙できますか?わかりません。)