如何在给定结束标记的LineNumber的情况下获取开始标记的LineNumber

时间:2016-10-12 05:54:17

标签: c# xml

鉴于此示例xml节点,

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

请帮忙。 感谢

2 个答案:

答案 0 :(得分:0)

这可能不是最好的方法,但经过深思熟虑后,我决定让下一行给我下一个节点。然后使用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将是员工节点

的开始标记的lineNumber

答案 1 :(得分: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是标记开始位置。您可以按+标签名称长度计算结束位置。