【发布时间】:2017-07-04 09:41:44
【问题描述】:
我需要在不同的 XML 文件中编写 GPS 数据。这些文件需要具有以下格式:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx>
<metadata>
<time>YYYY-MM-DDTHH:MM:SSZ</time>
</metadata>
<trk>
<name>YYYY-MM-DDTHH:MM:SSZ</name>
<trkseg>
<trkpt lat="12.1795" lon="12.3456">
<ele>-46.97</ele>
<time>YYYY-MM-DDTHH:MM:SSZ</time>
</trkpt>
// more trkpt
</trkseg>
</trk>
</gpx>
我尝试使用 XMLwriter 来完成。起初,它构建零件直到 trkpt.That 工作。包含 XmlWriterSettings 是因为错误告诉我使用 ConformanceLevel "Auto" 或 "fragmented" ,但这并没有解决我的问题。
XmlWriterSettings setting = new XmlWriterSettings();
setting.ConformanceLevel = ConformanceLevel.Auto;
setting.Indent = true;
DateTime localDate = DateTime.Now;
xmlWriter[0] = XmlWriter.Create("testbase.xml", setting);
for (int i = 1; i < (numOfXMLWriter); i++)
{
xmlWriter[i] = XmlWriter.Create(test[i].Text, setting);
}
int tmp = 0;
foreach (XmlWriter writer in xmlWriter)
{
writer.WriteStartDocument(true);
writer.WriteStartElement("gpx");
writer.WriteStartElement("metadata");
writer.WriteStartElement("time");
writer.WriteString(localDate.Year + "-" + localDate.Month + "-" + localDate.Day + "T" + localDate.Hour + ":" + localDate.Minute + ":" + localDate.Second);
writer.WriteEndElement(); //time
writer.WriteEndElement(); //metadata
//trk + name
writer.WriteStartElement("trkseg");
}
稍后接收到的 GPS 数据被写入单独的 trkpt。
xmlWriter[id].WriteStartElement("trkpt");
xmlWriter[id].WriteAttributeString("lat", splitData[4]);
xmlWriter[id].WriteAttributeString("lon", splitData[6]);
xmlWriter[id].WriteStartAttribute("ele");
xmlWriter[id].WriteString("0");
xmlWriter[id].WriteEndElement(); //</ele>
xmlWriter[id].WriteStartElement("time");
xmlWriter[id].WriteString(splitData[10][4] + splitData[10][5] + "-" + splitData[10][2] + splitData[10][3] + "-" + splitData[10][0] + splitData[10][1] + "T" + splitData[2][0] + splitData[2][1] + ":" + splitData[2][2] + splitData[2][3] + ":" + splitData[2][4] + splitData[2][5] + "Z");
xmlWriter[id].WriteEndElement(); //</time>
xmlWriter[id].WriteEndElement(); //</trkpt>
错误说:
InvalidOperationException: "Token StartElement in state EndRootElement would result in an invalid XML document”
我认为这是因为 XMLwriter 自动关闭所有节点,后来我尝试在根级别添加另一个节点。是否有可能阻止作者自行结束文档? 谢谢你的帮助! 乔纳斯
【问题讨论】:
-
我猜你的开始/结束通话是不平衡的。但我真正的问题是:你为什么直接使用
XmlWriter?这真的很辛苦,而且很容易出错(正如你所证明的那样)。为什么不使用 LINQ to XML? -
即使你想和
XmlWriter一起工作,为什么在你有GPS数据之前就开始写XML? -
@CharlesMager 我不知道 LinqToXml,我要试试看!
-
@DmitryOgurtsov 我想先写元数据等,然后附加 trkpts。第一部分是另一种方法,所以我需要先调用它,然后编写每个 GPS 点
-
@Jonas 在这种情况下你不应该使用
XmlWriter,事实上 LINQ to XML 似乎是更好的选择
标签: c# xml invalidoperationexception