在C#中将XML结构化文件解析为文本文件

时间:2016-11-22 14:35:14

标签: c# xml

我有一组具有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
}

但是这样解析它很麻烦,我很想知道是否有其他方法可以解析这种文件。

3 个答案:

答案 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;
        }