2016-10-12 4 views
1

の行番号与えられた開始タグの行番号、このサンプルXMLノードを考えると終了タグ

<employee id="emp_1"> 
    <fname>John</fname> 
    <lname>Doe</lname> 
</employee> 
<supervisor> 
    <fname>Jane</fname> 
    <lname>Does</lname> 
</supervisor> 

私は2つの与えられた変数を使用することができます取得する方法:私は希望の場合

lineNumber = 4; 
colNumber = 12; 

を位置を特定すると、終了タグの直後に表示されます。

"</employee>" 

従業員ノードの対応する開始タグ?

助けてください。 ありがとう

+1

XMLをプレーンテキストとして扱い、それに応じてコードを書くことは可能です... – A3006

+0

最初のコメントを見てください。 – mybirthname

+0

uhm、no。私はまだオープニングタグのlinenumberをどのように与えるのか分かりません – user6007010

答えて

0

これは最良の方法ではないかもしれませんが、多くの考えを与えた後、私はnextnodeを与える次の線を取得することを決めた。 nextnodeを使って、前の兄弟を得ました。

//...previous codes 
lineNumber++; 
var nextSibling = xElements.Where(elem => ((IXmlLineInfo)elem).LineNumber == lineNumber && 
              ((IXmlLineInfo)elem).LinePosition <= columnNumber).LastOrDefault(); 

var selectedNode = nextSibling.PreviousNode; 
if (((IXmlLineInfo)selectedNode).HasLineInfo()) 
{ 
    lineNumber = ((IXmlLineInfo)selectedNode).LineNumber; 
    columnNumber = ((IXmlLineInfo)selectedNode).LinePosition; 
} 

今LINENUMBERは、あなたが再解析現在のXElementにXNode.CreateReaderを活用することができ、従業員のノード

+0

各XElementの間にスペースがあればどうなりますか? – qxg

+0

まだ、私はまだ扱っていませんでしたが、私は、xmlを生成するメソッドを作成した人でもあったため、要素間に空白がないと仮定しました。しかし、これは最良の解決策ではありません – user6007010

0

の開始タグの行番号になります。それはより多くのリソースを必要としますが、機能します。

foreach (XElement e in elements) 
{ 
    using (var reader = e.CreateReader()) 
    { 
     var lineInfo = ((IXmlLineInfo)reader); 
     while (reader.Read()) 
     { 
      if (reader.NodeType == XmlNodeType.EndElement && reader.Depth == 0) 
      { 
       Console.WriteLine($"{e.Name}" 
        + $" - Open({((IXmlLineInfo)e).LineNumber},{((IXmlLineInfo)e).LinePosition})" 
        + $" Close({lineInfo.LineNumber},{lineInfo.LinePosition})"); 
      } 
     } 
    } 
} 

LinePositionはタグ開始位置です。 +タグ名の長さで終了位置を計算できます。

関連する問題