【问题标题】:How to get inner values from XML [closed]如何从 XML 中获取内部值
【发布时间】:2018-05-18 12:21:33
【问题描述】:

我有一个如下所示的 xml,因为我想获得第二个 SubNetwork 元素值和 tval 值,所以这里第一行值是 NC22tet_DS_U_6359_HolidayExpressInKV。我做了如下所示的 prtial 代码下面,如何获得每行的第二个SubNetworktval 值,最后我将把它们放入字典中,其中tval 是关键。这是几GB 大小的大XML,我发布了一小部分

(XmlReader xr = XmlReader.Create(path))
{
    string sitename = "";
    xr.MoveToContent();
    XNamespace xn = xr.LookupNamespace("tn");
    while (xr.Read())
    {
        while (xr.NodeType == XmlNodeType.Element && xr.NamespaceURI == tn && xr.LocalName == "mentNode" && xr.GetAttribute("id") == "TRM")
        {
            try
            {
                XElement sniipet = (XElement)XNode.ReadFrom(xr);
                var xdoc = new XDocument(sniipet);
                var orders = (from r in xdoc.Descendants(tn + "manages")
                              select new
                              {


                              }).ToList();

            }
            catch (Exception ex)
            {

            }
        }
    }
}

XML如下图

<?xml version="1.0" encoding="utf-8" ?>
<tn:mentNode id="TRM">
  <tn:attributes>
    <tn:manages>SubNetwork=TRM_R,SubNetwork=NC22,tval=tet_DS_U_6359_HolidayExpressInKV,Element=1</tn:manages>
    <tn:manages>SubNetwork=TRM_R,SubNetwork=NC22,tval=tet_DS_U_6352_MediaOneHtl,Element=1</tn:manages>
  </tn:attributes>
</tn:mentNode>

编辑

虽然 XML 很大 &lt;tn:mentNode id="TRM"&gt; 节点并没有那么大,我可以在字典中保存

【问题讨论】:

  • 所以你已经有了一些代码 - 会发生什么? (我怀疑我可以猜到,但这很棘手,因为我们不知道命名空间别名“tn”与哪个 URI 相关联。)我还强烈建议您删除那个空的 catch 块,或者至少将其更改为日志。如果出现错误,您可能想在那个时候停止处理,并且您几乎肯定想知道它而不是默默地忽略它。
  • 我正在正确写日志,这是我在这里发布的小测试代码
  • Empty catch 子句——有史以来最糟糕的错误处理。
  • 我已经告诉过,这是测试代码,XML 是大小为 5GB 的测试 XML,我在 catch 块中编写自定义日志
  • 你为什么一再告诉我们这是一个大文件。我们明白并完全理解您为什么使用 XmlReader 来处理它。我个人不明白的是您的实际问题/问题是什么。

标签: c# asp.net .net xml linq


【解决方案1】:

您可以只使用 XDocument 而不是 XmlReader :

            XDocument xr = XDocument.Load(path);

            List<string> orders = xr.Descendants().Where(x => (x.Name.LocalName == "mentNode") && ((string)x.Attribute("id") == "TRM"))
                .Select(x => x.Descendants().Where(y => y.Name.LocalName == "manages").Select(y => (string)y))
                .SelectMany(x => x).ToList();

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2013-11-05
    • 2012-07-24
    • 2021-05-06
    • 2021-10-15
    • 2013-06-01
    相关资源
    最近更新 更多