我已經被解析,需要下面的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如果我嘗試獲取不存在的certian屬性的值(IE:tNode.Attribute.GetNamedItem(「repeat」)。值在所有沒有repeat屬性的節點上失敗)。什麼是我可以驗證某個屬性是否存在的方法?
此外上面的代碼根本不乾淨。組織上述代碼的最佳方式是什麼?
編輯:我知道的方法,您可以單獨檢查屬性是否爲null或不從它們的值之前,但這使得代碼看起來非常骯髒,因爲我需要寫很多ifs(或嵌套的ifs)
if (tNode.Attributes.GetNamedItem("decimal") != null)
if (tNode.Attributes.GetNamedItem("decimal").Value == "true")
convert_decimal = true;
從長遠來看,如果我必須編寫更多的屬性,這會變得有問題。我想知道更多的這種有組織的方法(可能XML屬性可以枚舉?我不知道。)
豎起大拇指爲我的要求和寫一個示例代碼。如果有多個使用相同屬性的根,是否有合適的說法[XmlRoot(「tx」)],[XmlRoot(「rx」)]表示可以在執行任何一個根時引用同一個類反序列化? – l46kok 2012-07-20 05:28:18