2016-10-12 3 views
1

Учитывая этот пример XML-узел,Как получить LINENUMBER из открывающего тега, учитывая LineNumber закрывающего тега

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

я могу использовать две данные переменные:

lineNumber = 4; 
colNumber = 12; 

, если я бы найти положение, это будет сразу после закрытия тега,

"</employee>" 

возможно получить/вернуть LINENUMBER из соответствующий открывающий тег узла сотрудника?

помогите пожалуйста. Спасибо

+1

Возможно, если вы обрабатываете XML как обычный текст и записываете код соответственно ... – A3006

+0

Посмотрите первый комментарий, вот как вы можете это сделать с вашими требованиями. – mybirthname

+0

Умм, нет. я до сих пор не могу понять, как это даст мне linenumber открытого тега – user6007010

ответ

0

это не лучший способ, но, подумав, я просто решил получить следующую строку, которая даст мне следующий номер. затем, используя следующий номер, я получил предыдущего брата.

//...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 будет LINENUMBER для открытия тега узла сотрудника

+0

Что произойдет, если между каждым XElement есть пробел? – qxg

+0

, что я еще не обрабатывал, однако на данный момент я просто предположил, что между элементами не будет пробелов, так как я был тем, кто создал метод для генерации xml. но все же это не лучшее решение, хотя – user6007010

0

Вы можете использовать XNode.CreateReader повторно проанализировать текущую XElement. Это требует больше ресурсов, но работает.

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 - начальная позиция бирки. Вы можете рассчитать конечную позицию по длине имени тега.

Смежные вопросы