我有一组具有XML文件结构的文件(父子节点),但不是传统的XML文件。 结构如下所示:
<_ML_Message>
<TransactionId Value="0x02" />
<GroupNo Value = "2" />
<AbortOnError Value = "255" />
<MessageBody>
<GetProcParameterRequest>
<ServerId Value="0xFFFFFFFFFFFF" />
<ParameterTreePath Qty = "1" >
<_OctetString Value="0x0000800029FF" />
</ParameterTreePath>
</GetProcParameterRequest>
</MessageBody>
<CRC16 Value = "0" />
<EndOfMlMessage />
</_ML_Message>
<_ML_Message>
<TransactionId Value="0x03" />
<GroupNo Value = "3" />
<AbortOnError Value = "255" />
<MessageBody>
<CloseRequest>
</CloseRequest>
</MessageBody>
<CRC16 Value = "0" />
<EndOfMlMessage />
</_ML_Message>
由于我无法在此文件上使用标准C#XML库(例如,XMLDocument),因此我尝试解析它并将其用作普通文本文件,
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string xml = File.ReadAllText(baseDirectory + "MyXMLFile.xml");
if (xml.StartsWith("TransactionId"))
{
//Try to get the value
}
但是这样解析它很麻烦,我很想知道是否有其他方法可以解析这种文件。
答案 0 :(得分:3)
如果我理解正确的解决方案是添加假根元素并使用XMLDocument解析新文档。
<root>
<_ML_Message>
...
</_ML_Message>
<_ML_Message>
...
</_ML_Message>
</root>
答案 1 :(得分:2)
如果您的文件包含一系列有效的XML元素但没有根元素,请使用根元素包装该文件。然后,您可以使用普通的XML库来解析它。
或者,在消息边界上打破流,这些边界看起来是空行并解析每个块。其中任何一个都比自己解析元素要少。
答案 2 :(得分:1)
你可以尝试这个,但如果你想获得所有的transactionIds,你需要阅读所有
string transactionId ;
string rootStart = "<doc>";
string rootEnd = "</doc>";
string xml = rootStart + File.ReadAllText("test.txt") + rootEnd;
XElement el = XElement.Parse(xml);
var isExist = el.Descendants("TransactionId").Any();
if (isExist)
{
transactionId = el.Descendants("TransactionId").FirstOrDefault().FirstAttribute.Value;
}