【问题标题】:How to Extract SVG children html tag from xml file using linq in C#如何在 C# 中使用 linq 从 xml 文件中提取 SVG 子 html 标记
【发布时间】:2015-04-24 17:16:26
【问题描述】:

我在 MVC Web 项目中有一个 xml 文件,如下所示:

<Navigation>

 <item>
   <CoreId>1010</CoreId> 
   <p>
   <svg width="640" height="480" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
     <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
     <g>
       <title>Layer 1</title>
       <rect height="170" width="258" y="136.67" x="188" stroke-width="5" stroke="#000000" fill="#ff0000" id="svg_1"/>
     </g>
   </svg>
  </p>
   <Privilege>ADMIN</Privilege>
   <MenuID>10811010</MenuID>
   <ParentMenuID>1081</ParentMenuID>
   <ResourceKey>AP_Template</ResourceKey>
 </item>

我尝试从 menuId == 10811010 的项目中获取 svg 数据;

这是我的 C# 代码:

public string GetVPFCore(int vpfCore)
{
    VPFCore _localitem = new VPFCore();

    try
    {

        var element = from item in xmlController.Root.Descendants("item")
                      where (string)item.Element("MenuID") == vpfCore.ToString()
                      select new
                      {
                          _data = item.Element("p").ToString()
                      };
        foreach (var t in element)
        {

            _localitem.Data = t._data;
        }
        return _localitem.Data;

    }
    catch (Exception)
    {
        throw new IOException("The XML item was not found!");
    }

}

为什么不将 svg 数据嵌入到&lt;p&gt; 标签中就无法获取它。

这个函数的作用是只提取没有&lt;p&gt; 的svg 数据并将其注入到cshtml 视图中。

【问题讨论】:

  • 那么当你没有p标签时会发生什么?我强烈建议不要抓住Exception 并就问题所在做出假设 - 这很可能是一个完全不同的问题。如果您能提供一个简短但完整的程序来演示该问题,那将非常有帮助。 (当您只提供一个属性然后提取时,为什么还要使用匿名类型?为什么要创建一个VPFCore 对象,只是为了设置然后检索一个属性?有很多更简单的代码,您可以使用相同的效果。)
  • 不是很明显 - 它只是返回一个字符串......那么重复设置 Data 属性然后从获取它的值返回值不能仅仅通过返回 element.Last() 来完成,已将select 子句更改为select item.Element("p").ToString()?如果没有&lt;p&gt; 标签,我们仍然不知道出了什么问题,而且我们仍然没有一个简短但完整的示例......
  • 谢谢 Jon,该函数主要用于操作自定义对象 VPFCores,Data 成员假设该对象包含来自 DB 存储库的实际数据。我已按照要求将该服务更改为 xml。但是,完全同意,匿名对象在这里很丰富。我会删除它。当我得到空值时。
  • 当然,我在旧金山机场,准备前往另一个城市。给我几个小时,我会更新这个问题。我必须赶上计划。但是,是的,我的问题是 Martin 提到的关于 svg 命名空间的问题,以及为什么用 元素替换

    标记,查询返回 null。我会更新草图。谢谢大家的贡献。

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


【解决方案1】:

如果你想访问svg 元素,那么你需要考虑命名空间,所以定义

XNamespace svg = "http://www.w3.org/2000/svg";

然后item.Element("p").Element(svg + "svg") 为您提供嵌入的 SVG 文档的根元素。

【讨论】:

  • 请问“svg”字符串的作用是什么?它在所有预先存在的 svg 标签前面添加 svg 字符串: w3.org/2000/svg" xmlns:svg="w3.org/2000/svg"> Sample
  • 我使用了一个从字符串构造的XNamespace 对象,有关LINQ to XML 的详细信息,请参阅msdn.microsoft.com/en-us/library/bb387093%28v=vs.110%29.aspx。由于我的代码建议只是使用XNamespace 在您的示例中选择一个节点,我不直接明白为什么您说您在标记中得到前缀svg。也许您可以使用产生结果的代码的详细信息来编辑您的问题。
  • 我认为这个问题与元素选择无关,它只是由您的输入具有&lt;svg width="640" height="480" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"&gt; 以及当同一个命名空间有两个命名空间声明时 LINQ to XML 执行的默认序列化引起的。我意识到,如果您想将带有 SVG 的 HTML5 输出为 text/html(当不允许使用命名空间前缀时),这可能是一个问题,但我认为这是一个不同的问题,需要一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多