如何通过行号从 XDocument 获取 XElement
How to get XElement from XDocument by Line Number
在 C# 中是否可以通过给定来获取 XDocument 的 XElement
行号?
我有任何测试 XML 比如:
<Student>
<Name>Josphine</Name>
</Student>
<Student>
<Name>Hendrick</Name>
</Student>
我想给任何整数作为参数,比如 5。
5 会给我元素 <Name>Hendrick</Name>
这有可能吗?或者我需要解析整个
XDocument by a Reader 并检查每个循环的行号。
您可以将文件读取到字符串数组
string[] lines = File.ReadAllLines("path/to/file");
然后让你的台词像 lines[4]
。
或者您最好查看 XPath,因为您的 XML 文档可以更改。
看看这些例子和教程:XPath Examples, Selecting Nodes。
还有另一种方法,如果您的 XML 格式正确并且您希望仅使用 XLinq
完成工作,那么下面的代码可能会对您有所帮助:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Parse(@"<Students>
<Student>
<Name>Josphine</Name>
</Student>
<Student>
<Name>Hendrick</Name>
</Student>
</Students>", LoadOptions.SetLineInfo);
IEnumerable<XElement> descendants = doc.Descendants();
foreach (XElement ele in descendants)
{
string ln_num = (((IXmlLineInfo)ele).HasLineInfo() ? ((IXmlLineInfo)ele).LineNumber.ToString() : "");
string ln_pos = (((IXmlLineInfo)ele).HasLineInfo() ? ((IXmlLineInfo)ele).LinePosition.ToString() : "");
Console.WriteLine(string.Format("{0} ({1}): at line no. {2}, position {3}", ele.Name.ToString(), ele.Value.ToString(), ln_num.ToString(), ln_pos.ToString()));
}
Console.ReadKey();
}
}
}
在 C# 中是否可以通过给定来获取 XDocument 的 XElement 行号?
我有任何测试 XML 比如:
<Student>
<Name>Josphine</Name>
</Student>
<Student>
<Name>Hendrick</Name>
</Student>
我想给任何整数作为参数,比如 5。
5 会给我元素 <Name>Hendrick</Name>
这有可能吗?或者我需要解析整个
XDocument by a Reader 并检查每个循环的行号。
您可以将文件读取到字符串数组
string[] lines = File.ReadAllLines("path/to/file");
然后让你的台词像 lines[4]
。
或者您最好查看 XPath,因为您的 XML 文档可以更改。
看看这些例子和教程:XPath Examples, Selecting Nodes。
还有另一种方法,如果您的 XML 格式正确并且您希望仅使用 XLinq
完成工作,那么下面的代码可能会对您有所帮助:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Parse(@"<Students>
<Student>
<Name>Josphine</Name>
</Student>
<Student>
<Name>Hendrick</Name>
</Student>
</Students>", LoadOptions.SetLineInfo);
IEnumerable<XElement> descendants = doc.Descendants();
foreach (XElement ele in descendants)
{
string ln_num = (((IXmlLineInfo)ele).HasLineInfo() ? ((IXmlLineInfo)ele).LineNumber.ToString() : "");
string ln_pos = (((IXmlLineInfo)ele).HasLineInfo() ? ((IXmlLineInfo)ele).LinePosition.ToString() : "");
Console.WriteLine(string.Format("{0} ({1}): at line no. {2}, position {3}", ele.Name.ToString(), ele.Value.ToString(), ln_num.ToString(), ln_pos.ToString()));
}
Console.ReadKey();
}
}
}