2016-11-22 73 views
2

我有一组具有XML文件(父 - 子节点)结构但不是传统XML文件的文件。 的结构是这样的:将XML结构化文件解析为C#中的文本文件

<_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

为什么你不能使用标准的XML库?什么阻止你插入'<! DOCTYPE ...>'您需要将其设置为有效的XML文件?或者在其他方面无效? (不遵循XML规范的注释,CData,Quotes等)。 –

+0

正则表达式是要走的路...但除非限制严重,否则您肯定应该使用解析器库。 –

+3

如果它的多个根节点只是将它们全部包装在一个''中,那么你发布的东西就会解析得很好。使用XElement.Parse()您不需要文档类型。 –

回答

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; 
     } 
+0

感谢您的回答!但是你也可以告诉我如何从其他子节点获取值吗?例如参数treepath中的'_OctetString Value'。 – agenthost

+1

是这里是例子:string transactionId; string rootStart =“”; string rootEnd =“”; string xml = rootStart + File.ReadAllText(“test.txt”)+ rootEnd; XElement el = XElement.Parse(xml); var isExist = el.Descendants(“TransactionId”)。Any(); (isExist) transactionId = el.Descendants(“TransactionId”)。FirstOrDefault()。FirstAttribute.Value; } var octetString = el.Descendants(“_ OctetString”)。FirstOrDefault()。FirstAttribute.Value; –

+1

@agenthost或者在上面添加以下代码行示例var octetString = el.Descendants(“_ OctetString”)。FirstOrDefault()。FirstAttribute.Value; –

2

如果您有一个包含一系列有效XML元素但没有根元素的文件,请使用根元素包装文件。然后您可以使用普通的XML库来解析它。

或者,将消息边界上的流分解为空白行并解析每个块。这些任何一项都不会比试图自己解析元素的工作少。

3

如果我理解你正确的解决方案是添加假根元素并用XMLDocument解析新文档。

<root> 
    <_ML_Message> 
    ... 
    </_ML_Message> 
    <_ML_Message> 
    ... 
    </_ML_Message> 
</root>