簡體   English   中英

如何在 C# 中正確驗證 svg 字符串?

[英]How to properly validate a svg string in C#?

我正在嘗試使用我制作的這個小 util 方法來驗證給定的字符串是否是有效的 svg:

public static bool IsValidSvg(string str) {
    try {
        var svg = XDocument.Load(new StringReader(str));
        return svg.Root.Name.LocalName.Equals("svg");
    } catch {
        return false;
    }
}

這適用於 90% 的情況,但是,例如,我有一個 svg,它的開始標簽如下:

<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
 x="0px" y="0px" width="599.33398px" height="490.66748px" viewBox="0 0 599.33398 490.66748"
 enable-background="new 0 0 599.33398 490.66748" xml:space="preserve">

然后驗證失敗,因為它不知道 ns_extend 是什么......它拋出:

System.Xml.XmlException: 引用的實體“ns_extend”不存在。 第 1 行,位置 53。

我怎樣才能解決這個問題? svg 呈現正確,所以它應該是一個有效的 svg ...

對您的方法進行快速而骯臟的修復:

private static bool IsSvg(string input)
{
    try
    {
        using (var file = new FileStream(input, FileMode.Open, FileAccess.Read))
        using (var reader = new XmlTextReader(file) {XmlResolver = null})
            return reader.Read() && reader.Name.Equals("svg", StringComparison.InvariantCultureIgnoreCase);
    }
    catch
    {
        return false;
    }
}

通過將XmlResolver屬性設置為null ,閱讀器將忽略 DTD 引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM