2016-11-22 111 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>