2016-11-22 13 views
2

XMLファイル(親子ノード)の構造を持ち、従来のXMLファイルではない一連のファイルがあります。 構造のようになります。私はそれを解析し、通常のテキストファイルと同じようにそれを使用しようとしています。このファイルに(例えば、XMLDocumentの)標準のC#のXMLライブラリを使用することはできませんのでC#でテキストファイルとして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> 

string baseDirectory = AppDomain.CurrentDomain.BaseDirectory; 
string xml = File.ReadAllText(baseDirectory + "MyXMLFile.xml"); 
if (xml.StartsWith("TransactionId")) 
{ 
    //Try to get the value 
} 

このように解析するのは現時点では面倒ですが、この種のファイルを解析する別の方法があるのだろうかと思いました。

+3

なぜあなたは、標準のXMLライブラリを使用することはできませんを読み取るために必要なすべてのtransactionIdsを取得したい場合は?あなたが '<! DOCTYPE ...> 'あなたはそれを有効なXMLファイルにする必要がありますか?それとも他の方法では無効ですか? (コメント、CData、引用などのXML仕様には従いません)。 –

+0

Regexはやり方です...しかし、制限が深刻でない限り、あなたは間違いなくパーサライブラリを使うべきです。 –

+3

複数のルートノードがすべて ' 'にまとめられていると、投稿したものは正しく解析されます。 XElement.Parse()では、doctypeは必要ありません。 –

答えて

1

あなたはこれを試すことができますが、あなたはすべての

 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; 文字列rootStart = ""; ""; 文字列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; } 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> 
関連する問題