我有一个大型XML文件,所以我正在使用XMLTextReader。我无法阅读该值,因为格式与我使用的其他XML文件略有不同。
<class>
<column>Size</column><int>30</int>
<column>TeamColor</column><string>red</string>
...
</class>
如何读取尺寸,然后获得值30?我现在有了
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
element = reader.Name;
else if (reader.NodeType == XmlNodeType.Text)
{
if (element == "column")
{
if(reader.Value == "Size")
//can get true here, but can't return the int value next to it
}
}
}
答案 0 :(得分:0)
如果您可以使用xpath,请从<column>
上下文节点尝试(following-sibling::*)[1]
。这将沿着下一个兄弟轴选择元素*
(与上下文相对应的东西,但按文档顺序排列),然后返回序列的第一个元素。
答案 1 :(得分:0)
您可以在Hashtable
。
尝试使用这段代码片段:
Hashtable hashTable = new Hashtable();
int intVal;
string prevColumnName = "";
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
element = reader.Name;
}
else if (reader.NodeType == XmlNodeType.Text)
{
switch (element.ToLower())
{
case "column":
prevColumnName = reader.Value;
hashTable.Add(reader.Value, null);
break;
case "int":
if (int.TryParse(reader.Value, out intVal))
hashTable[prevColumnName] = intVal;
break;
case "string":
hashTable[prevColumnName] = reader.Value;
break;
}
}
}
用法:
int size = Convert.ToInt32(hashTable["Size"]);
答案 2 :(得分:0)
除非您存储以前的值,否则您需要添加一个跳过条件,允许您在命中列元素时进行额外的读取(对于兄弟),然后在下一个循环中正确处理任何其他读取。
bool skipRead = false;
while (skipRead || reader.Read())
{
skipRead = false;
if (reader.NodeType == XmlNodeType.Element)
element = reader.Name;
else if (reader.NodeType == XmlNodeType.Text)
{
if (element == "column")
{
if (Reader.Read())
{
if(reader.NodeType == XmlNodeType.Element && reader.Name == "Size")
{
// do whatever you need to here with reader.Value.
// E.g size = (int) reader.Value
skipRead = false;
continue;
} // Additional ifs for other elements in column can go here.
else
{
skipRead = true;
continue;
}
}
else
{
break;
}
}
}
}