【问题标题】:How to get XElement from XDocument by Line Number如何通过行号从 XDocument 获取 XElement
【发布时间】:2016-04-04 14:07:01
【问题描述】:

在 C# 中是否有可能通过让步来获取 XDocument 的 XElement 行号?

我有任何测试 XML,例如:

<Student>
  <Name>Josphine</Name>
</Student>
<Student>
  <Name>Hendrick</Name>
</Student>

我想将任何整数作为参数,例如 5。 5 会给我元素&lt;Name&gt;Hendrick&lt;/Name&gt; 这有可能吗?还是我需要解析整个 XDocument 通过 Reader 并检查每个循环的行号。

【问题讨论】:

  • 为什么要按行号获取?如果元素被重新排列(对 XML 完全有效),或者空格被消除(对 XML 也有效)怎么办?您声明的请求具有非常糟糕的代码气味,您应该改为查看 XPath 查询。
  • 我用一个 xsd 文件验证一个 xml 文件....这个方法给我返回带有相应行号的错误消息。这就是为什么我想按行号获取元素。我为此构建了一个 ASP.NET MVC 程序。我想给用户不正确的元素的整个内容。
  • 你不能 XML 不使用换行符作为分隔符,所以如果这想要全部在一行上,它与换行符相同
  • 找到错误的最佳选择是打开文件并检查它

标签: c# linq-to-xml


【解决方案1】:

您可以将文件读取到字符串数组

string[] lines = File.ReadAllLines("path/to/file");

然后像lines[4]一样获取您的线路。

或者您应该更好地查看 XPath,因为您的 XML 文档可以更改。

看看这些例子和教程:XPath ExamplesSelecting Nodes

【讨论】:

    【解决方案2】:

    如果您的 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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2016-05-15
      • 2014-08-27
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多