我试图在C#visual studio中读取xml,但不知道如何做得很好。首先,我尝试了一个if块,如下所示:
if (ReadToNextDescendant("painted_blue"))
{
// access the coordinates inside and do some work
// this works
}
它有效,我能够从绘制的蓝色坐标中提取数据。但是,我再次尝试了wall_horizontal,它没有用。因此,我得出结论,我需要某种新功能,或者可能采用不同的方法。但是,我对XML解析并不精明。首先,我并不完全理解ReadToDescendant的功能以及为什么它第二次无法正常工作。有人能指出我正确的方向吗?
<painted_blue>
(0,0)
(1,0)
(1,5)
(2,2)
</painted_blue>
<walls_horizontal>
(1,2)
(1,3)
(1,4)
(2,1)
(2,2)
</walls_horizontal>
<walls_vertical>
(1,1)
(1,2)
(1,3)
(2,0)
(2,1)
</walls_vertical>
答案 0 :(得分:1)
如果可以,我真的建议将XML格式更改为:
<walls_horizontal>
<coord x="1" y="2" />
<coord x="1" y="3" />
<coord x="1" y="4" />
</walls_horizontal>
拥有坐标节点将更容易管理。
这是一些代码
public static XmlReaderSettings ReaderSettings()
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.CloseInput = true;
settings.IgnoreComments = true;
settings.IgnoreProcessingInstructions = true;
settings.IgnoreWhitespace = true;
return settings;
}
...你在文件中读到的地方
Stream stream = File.Open(filePath, FileMode.Open);
var reader = XmlReader.Create(stream, XmlHelper.ReaderSettings());
if (!reader.IsEmptyElement)
{
string tagName = reader.Name;
while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement))
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "wall_horizontal":
var coord = new Coord(reader);
break;
}
}
}
}
在自定义坐标类中执行以下操作:
public Coord(XmlReader reader)
{
if (reader == null) throw new ArgumentNullException("reader");
if (!reader.IsEmptyElement)
{
string tagName = reader.Name;
while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement && reader.Name == "coord"))
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "coord":
var x = reader.GetAttribute("x");
var y = reader.GetAttribute("y");
break;
}
}
}
}
}
然后用你的x和y值做点什么。这个代码是我使用的锅炉板。代码可能需要一些修改来处理您的情况。我希望它能指出你正确的方向!