鉴于此示例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?
请帮忙。 感谢
答案 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是标记开始位置。您可以按+标签名称长度计算结束位置。