信息发布→ 登录 注册 退出

C#中解析SVG这类特殊的XML方言 命名空间与特定属性的处理

发布时间:2025-12-01

点击量:
解析SVG需处理命名空间:①使用XNamespace声明默认命名空间;②查询元素时需添加命名空间前缀;③普通属性直接获取,带前缀属性需用对应命名空间。

c#中解析svg这类特殊的xml方言 命名空间与特定属性的处理

在C#中处理SVG这类具有命名空间和特定属性结构的XML方言时,不能像处理普通XML那样直接使用XDocumentXmlDocument进行简单查询。SVG基于XML,并使用了XML命名空间(特别是默认命名空间),这会影响元素和属性的查找方式。正确解析SVG需要特别注意命名空间的声明与使用。

理解SVG中的命名空间

SVG文档通常包含如下根元素:

<font face="Courier New"><svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect x="10" y="10" width="100" height="50"/>
</svg></font>

这里的xmlns="http://www.w3.org/2000/svg"定义了一个默认命名空间。这意味着所有未加前缀的元素(如svgrect)都属于该命名空间。如果忽略这一点,在用LINQ to XML查询时将无法匹配到这些元素。

使用XNamespace正确查询元素

在C#中使用System.Xml.Linq时,必须显式声明命名空间才能进行有效查询:

XDocument doc = XDocument.Parse(svgContent); XNamespace svgNs = "http://www.w3.org/2000/svg"; var rects = doc.Descendants(svgNs + "rect"); foreach (var rect in rects) { string x = rect.Attribute("x")?.Value; string y = rect.Attribute("y")?.Value; string width = rect.Attribute("width")?.Value; string height = rect.Attribute("height")?.Value; // 处理属性值 }

注意:即使属性没有显式命名空间前缀,在默认命名空间下的元素所包含的属性也无需加命名空间。因此Attribute("x")可以直接使用,不需要写成svgNs + "x"

PatentPal专利申请写作 PatentPal专利申请写作

AI软件来为专利申请自动生成内容

PatentPal专利申请写作 274 查看详情 PatentPal专利申请写作

处理带前缀的命名空间或混合内容

某些SVG可能包含其他命名空间,例如XLink用于引用资源:

<font face="Courier New"><svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <use xlink:href="#icon" x="10" y="10"/>
</svg></font>

这时需要为xlink单独定义命名空间:

XNamespace xlink = "http://www.w3.org/1999/xlink"; var uses = doc.Descendants(svgNs + "use"); foreach (var use in uses) { string href = use.Attribute(xlink + "href")?.Value; }

关键点是:xlink这样的非默认命名空间必须通过前缀+命名空间的方式访问其属性。

常见问题与建议

  • 不要假设Descendants("rect")能查到元素 —— 必须加上命名空间。
  • 读取属性时,普通属性(如widthid)仍按名称直接获取;只有带命名空间前缀的属性才需命名空间参与。
  • 若不确定命名空间,可先打印根元素的Name.Namespace来确认。
  • 对于复杂SVG文件(如由Illustrator生成),可能存在冗余命名空间或嵌套结构,建议先简化测试样本。

基本上就这些。只要掌握命名空间的处理逻辑,C#完全可以高效解析SVG中的结构与属性信息。不复杂但容易忽略。

以上就是C#中解析SVG这类特殊的XML方言 命名空间与特定属性的处理的详细内容,更多请关注其它相关文章!


相关文章: PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  AO3访问入口汇总 AO3网页版同人作品一键直达  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  Archive of Our Own官网直达 AO3最新可用地址一览  Go语言中动态执行代码字符串的策略与实践  Composer的 COMPOSER_PROCESS_TIMEOUT 配置项有什么用_解决因执行时间过长而失败的Composer脚本  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  外媒分析《GTA6》定价:卖100美元可以但真没必要!  outlook中文官网入口地址 outlook官方中文版直达首页链接  Node.js中HTML按钮与J*aScript函数交互的正确姿势  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  React项目中导航栏Logo自适应布局:避免裁剪与布局溢出  Golang如何优雅处理error_Golang error处理最佳实践总结  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  qq游戏跨平台入口_qq游戏多设备同步登录  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  WooCommerce产品页高级定制:实现基于分类的交叉销售  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  解决J*aScript中重复选择项的确认对话框显示问题  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  c++如何使用chrono库处理时间_c++标准库时间与日期操作  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  age动漫网站入口 age动漫官网直接访问入口  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  Python大型XML文件高效流式解析教程  QQ官网正版登录链接 QQ在线登录入口最新  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  在WordPress中通过REST API访问受BasicAuth保护的站点内容  2026年CSGO开箱网站推荐 CSGO开箱平台精选  Go语言HTML解析:利用Goquery精准获取指定元素内容  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  在Socket.IO连接中实现Access Token自动更新与动态重连  12306选座如何查看座位示意图_12306座位示意图解读与使用  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!