c# - 如何根据某些属性选择 xml 元素并将其完整写回另一个文件

标签 c# xml xmlreader xmlwriter

我正在使用 XmlTextReader 读取一个 svg/xml,我只想将它的一些元素写回到一个新的 svg/xml 文件中

<svg>
    <rect x="135.7" y="537.4" fill="none" stroke="#000000" stroke-width="0.2894" width="36.6" height="42.2"/>
    <rect x="99" y="537.4" fill="#A0C9EC" stroke="#000000" stroke-width="0.2894" width="36.7" height="42.2"/>
</svg>

我想要填充为“无”的rect元素,所以我开始读写

 var reader = new XmlTextReader(file.InputStream);
 var writer = new XmlTextWriter(svgPath + fileNameWithoutExtension + "-less" + extension, null);
 writer.WriteStartDocument();
 while (reader.Read())
 {
    switch (reader.NodeType)
    {
         case XmlNodeType.Element:
         if (reader.Name == "svg")
         {
            writer.WriteStartElement(reader.Name);
            while(reader.MoveToNextAttribute()){
                 writer.WriteAttributes(reader, true);
            }
         }
         if (reader.Name == "rect" || reader.Name == "polygon")
         {
            while(reader.MoveToNextAttribute()){
                 if(reader.Name == "fill" && reader.value == "none"){
                     writer.WriteStartElement(reader.Name);
                     writer.WriteAttributes(reader, true);
                     writer.WriteEndElement();
                 }
            }
         }
         break;
         case XmlNodeType.EndElement:
              break;

         default:
              break;
    }
 }
 writer.WriteEndElement();
 writer.WriteEndDocument();
 writer.Close();

但这会返回一个包含“fill”元素且没有“x”和“y”属性的文件(因为 WriteAttributes 从当前位置读取并且读取器在 fill 属性中)

 <svg>
     <fill="none" stroke="#000000" stroke-width="0.2894" width="36.6" height="42.2"/>
 </svg>

有没有办法得到我想要的结果?我不想使用 XmlDocument,因为我的 svg 文件很大,用 XmlDoc.Load

加载需要很长时间

谢谢

最佳答案

尝试以下操作;你可以适应:

     if (reader.Name == "rect" || reader.Name == "polygon") 
     { 
           string fill = reader.GetAttribute("fill"); //Read ahead for the value of the fill attr
           if(String.Compare(fill, "none", StringComparison.InvariantCultureIgnoreCase) == 0) //if the value is what we expect then just wholesale copy this node.
           {
                writer.WriteStartElement(reader.Name);
                writer.WriteAttributes(reader, true); 
                writer.WriteEndElement(); 
            } 
        } 

请注意 GetAttribute不会移动读者,让您停留在矩形或多边形节点的上下文中。

您也可以尝试使用单个阅读器修改您的第一次尝试。MoveToFirstAttribute() - 我还没有测试过,但它应该会让您回到当前节点的第一个元素。

您可能还想研究 XPathDocument 类 - 这比 XmlDocument 轻很多,但您仍然首先将整个结构加载到内存中,因此可能不合适 - 然后选择您想要的节点只是使用XPath:

//rect[@fill='none'] || //polygon[@fill='none'] 

最后,您还可以使用 XSLT。如果您想为您的源文档发布一个更完整的结构,我很乐意为您写一个。

关于c# - 如何根据某些属性选择 xml 元素并将其完整写回另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902481/

相关文章:

c# - 如何配置 Web API XML 序列化程序以序列化所有类的只读属性?

Android EditText 不显示多行

php - 这三个选项中的哪一个可以最快填充我的数据库表?

c# - 停止时同步 Timers.Timer elapsed 方法

c# - 轮询类应该是静态的

c# - 在 SwashBuckle 中使用 IOperationFilter 删除路由

java - 从字符串中解析日期

c# - 如何为 XmlReader 指定超时?

c# - 如何使用XmlReader以int形式获取属性值?

c# - 使用依赖注入(inject)处理对象