我正在使用 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/