Получить значение атрибута из корневого элемента SVG (XML) - PullRequest
0 голосов
/ 28 ноября 2018

Я успешно получил значения атрибутов из подэлементов в моем SVG с использованием синтаксического анализатора XML, но у меня возникают проблемы с получением значения окна просмотра из того же SVG.

Вот верхняя часть SVG.Я пытаюсь разобрать "0 0 2491 2491" из атрибута viewBox элемента svg:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<svg viewBox="0 0 2491 2491" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve">
<defs>
<clipPath id="clipId0">
<path d="M0,2491 2491,2491 2491,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(100,100,100)" stroke-width="0.5" />

Некоторые примеры кода, которые не дали результатов:

//from calling method
xmlParser.GetAttributeValueAtSubElement("svg", "viewBox")

//class variables
private readonly XNamespace _NameSpace = "http://www.w3.org/2000/svg"; 
private readonly XNamespace _NameSpace_xlink = "http://www.w3.org/1999/xlink";  

//class constructor
        public XMLParser(string filePath)
        {
            _FilePath = filePath;
            _XML_Doc = XDocument.Load(_FilePath);
            _XML_Elem = XElement.Load(_FilePath);
        }

//attempt 1 failed
    public string GetAttributeValueAtSubElement(string subElementName, string attributeName)
    {

        string rv = string.Empty;
        IEnumerable<XAttribute> attribs =
            from el in _XML_Elem.Descendants(_NameSpace + subElementName) 
            select el.Attribute(attributeName);


        foreach (XAttribute attrib in attribs)
        { rv = attrib.Value; }

        return rv;
    }

//attempt 2 failed
        public string GetAttributeValueAtSubElement(string subElementName, string attributeName)
        {

        string rv = string.Empty;

        IEnumerable<XAttribute> attribs =
           from el in _XML_Elem.Elements(_NameSpace + subElementName) 
            select el.Attribute(attributeName);

        foreach (XAttribute attrib in attribs)
        { rv = attrib.Value; }

        return rv;
    }

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Simple.Viewbox - не потомок, а корень.:

            XDocument doc = XDocument.Load(FILENAME);
            XElement svg = doc.Root;

            string viewBox = (string)svg.Attribute("viewBox");
0 голосов
/ 28 ноября 2018

После того, как мне не повезло или я не получил никаких ответов, я успешно получил нужные мне значения из первого элемента элемента, используя:

    public string GetAttributeValueAtSubElement()
    {

        string rv = string.Empty;

        IEnumerable<XAttribute> attribs =
        from el in _XML_Elem.Descendants(_NameSpace + "path")  also?
            select el.Attribute("d");

        if (attribs.Count() > 0 && attribs.First<XAttribute>().Value.Contains("M0,")
            && attribs.First<XAttribute>().Value.Contains("z"))
            rv = attribs.First<XAttribute>().Value; 

        return rv;
    }

Возвращает "M0,2491 2491,2491 2491,00,0 z "

Первый путь имеет те же координаты, что и окно просмотра, поэтому это должно работать для меня.

РЕДАКТИРОВАТЬ: Это сработало, но после получения ответа, который я в конечном итоге выбрал,Я изменил свой код в соответствии с подходом в этом ответе.

...