Страницы

Поиск по вопросам

Показаны сообщения с ярлыком xml. Показать все сообщения
Показаны сообщения с ярлыком xml. Показать все сообщения

понедельник, 13 апреля 2020 г.

Парсинг XML

#xml #android #синтаксический_анализ

                    
Работаю на андроид с Xml. Столкнулась с тем, что мне нужно парсить xml такого вида:




Понимаю, как достать текст, атрибуты, а как мне достать слово "Пример"?    


Ответы

Ответ 1



Надо парсить SAX'ом, простейший пример использования здесь Касаемо секции CDATA ее надо ловить в хэндлере DefaultHandler.characters(), причем с конкатенацией, поскольку он может вызываться несколько раз. P.S. @atnartur неправ, поскольку парсер вернет без , вернет только Пример

Ответ 2



Простой пример Serializing with CDATA blocks http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

Xml-сериализация атрибутов вложенных узлов в свойства объекта

#c_sharp #xml #net

                    
Подскажите пожалуйста, есть ли возможность десериализовать Xml-элемент подобной структуры:
  
    
    
    
  

в объект примерно такого класса:
[XmlRoot("Service")]
public class Service
{
    public string Host { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

То есть смысл в том, чтобы не создавать для каждого вложенного узла свой класс, наподобие
этого:
public class Host
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}

и затем не городить огород:
[XmlRoot("Service")]
public class Service
{
    [XmlElement("Host")]
    public Host Host { get; set; }
    .
    .
    .
}

...

var host = service.Host.Value;

Хочется верить, что атрибуты "value" всех вложенных узлов можно сразу замапить на
string-свойства. Буду благодарен за любой совет.    


Ответы

Ответ 1



Может быть, пусть Service имплементирует интерфейс IXmlSerializable и реализует ReadXml разумным образом? Сделать это только при помощи атрибутов невозможно: свойства определяют либо такой: http://domain.com:80 user_name password либо такой синтаксис. Я тут набросал код: [XmlRoot] class Service : IXmlSerializable { string Host; string Username; string Password; XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { if (reader.IsEmptyElement) // проверяем формат throw new Exception(); // надо какое-то другое исключение, конечно reader.ReadStartElement(); // читаем открывающий тег Service while (reader.IsStartElement()) // пока есть вложенные теги... processNode(reader); // читаем их reader.ReadEndElement(); // читаем закрывающий тег } void processNode(XmlReader reader) { if (!reader.IsEmptyElement) // опять проверяем формат throw new Exception(); if (reader.AttributeCount != 1) // то же самое throw new Exception(); string name = reader.Name; string value = reader.GetAttribute(0); setField(name, value); reader.ReadStartElement(); // переходим к следующему } void setField(string name, string value) { switch (name) // ну или reflection, если хотите { case "Host": Host = value; break; case "Username": Username = value; break; case "Password": Password = value; break; } } void IXmlSerializable.WriteXml(XmlWriter writer) { serializeField(writer, "Host", Host); serializeField(writer, "Username", Username); serializeField(writer, "Password", Password); } void serializeField(XmlWriter writer, string name, string value) { writer.WriteStartElement(name); writer.WriteStartAttribute("Value"); writer.WriteString(value); writer.WriteEndElement(); } }

суббота, 11 апреля 2020 г.

Перенос строк в списке xslt

#xml #xslt

                    
Уже битый час хочу добавить перенос строки в список,подскажите как это сделать



  

  
    
  

  
    


  • Ответы

    Ответ 1



    Добавил в начало документа вместо и тег
    заработал.

    Как в XML найти узел по атрибуту и удалить или изменить?

    #c_sharp #xml

                        
    
    Как найти узел по атрибуту?
    Как найти узел по атрибуту и удалить?
    Как найти узел по атрибуту и изменить атрибут?
    
    
    Только без LINQ.
    
    Пример XML-файла.
    
    System.xml
    
    
      
        Microsoft
        48
      
      
        Google
        48
      
    
    
        
    


    Ответы

    Ответ 1



    1. XmlNodeList nodes = xmlDoc.SelectNodes("//element[@name='value']"); 2. for (int i = nodes.Count - 1; i >= 0; i--) { nodes[i].ParentNode.RemoveChild(nodes[i]); } 3. XmlNode node = xmlDoc.SelectSingleNode("//element[@name='value']"); node.Attributes[0].Value = newValue;

    Получить стиль с xml

    #java #xml #excel #apache_poi

                        
    Всем привет работаю на apache poi надо через xml получить стиль ячеек а именно 'объединение'.
    Сделал таким вот образом 
    
    
              21
              3. Жыл соңына жылжымалы құрам
     
    
    
    А в самом классе 
    
    spreadsheet.addMergedRegion(new CellRangeAddress(
        records.getMergeR(),
        records.getMergeR1(),
        records.getMergeC(),
        records.getMergeC1())
    );
    
    
    Есть ли альтернативный способ это сделать?!
        
    


    Ответы

    Ответ 1



    // Объединить ячейки(startRow, endRow, startColumn, endColumn) sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); тут подробней написано http://www.programru.com/blog/MYTO0ADMwITz.html

    четверг, 9 апреля 2020 г.

    Как исключить некоторые свойства при серилизации

    #c_sharp #xml #serialize

                        
    Я пытаюсь сериализовать объект с несколькими свойствами, но не хочу включать все
    свойства при сериализации.
    
    Конечно, я мог бы использовать атрибут [XmlIgnore], но мне необходима возможность
    делать это динамически.
    
    Вопрос заключается в следующем как исключить некоторые свойства при серилизации не
    изменяя исходного класса, при это хотелось бы иметь строгую типизацию.
    
    Заранее спасибо.
        
    


    Ответы

    Ответ 1



    сделать это можно следующим образом. Воспользуемся готовым классом XmlAttributeOverrides но сделаем пару методов расширений для добавления строгой типизации: public static class XmlAttributeOverridesHelpers { public static void Add(this XmlAttributeOverrides overrides, Expression> propertySelector, XmlAttributes attributes) { overrides.Add(typeof(T), propertySelector.BuildString(), attributes); } public static string BuildString(this Expression propertySelector) { switch (propertySelector.NodeType) { case ExpressionType.Lambda: LambdaExpression lambdaExpression = (LambdaExpression)propertySelector; return BuildString(lambdaExpression.Body); case ExpressionType.Convert: case ExpressionType.Quote: UnaryExpression unaryExpression = (UnaryExpression)propertySelector; return BuildString(unaryExpression.Operand); case ExpressionType.MemberAccess: MemberExpression memberExpression = (MemberExpression)propertySelector; MemberInfo propertyInfo = memberExpression.Member; if (memberExpression.Expression is ParameterExpression) { return propertyInfo.Name; } else { // we've got a nested property (e.g. MyType.SomeProperty.SomeNestedProperty) return BuildString(memberExpression.Expression) + "." + propertyInfo.Name; } default: // drop out and throw break; } throw new InvalidOperationException("Expression must be a member expression: " + propertySelector.ToString()); } } применять можно следующим образом: var overrides = new XmlAttributeOverrides(); var ignore = new XmlAttributes { XmlIgnore = true }; overrides.Add(m => m.Id, ignore); overrides.Add(m => m.DateChanged, ignore); Type t = typeof(List); XmlSerializer serial = new XmlSerializer(t, overrides); Решение было найдено здесь

    Ответ 2



    Возможно Вам подойдет атрибут NonSerializedAttribute

    вторник, 7 апреля 2020 г.

    Использование .ToList() с XDocument

    #c_sharp #net #xml #linq #разметка

                        
    Есть вот такое выражение:
    
    var ext =
                    xDoc.XPathSelectElements("*//nodes")
                        .DescendantNodes().ToList();
    
    
    И по нему есть несколько вопросов:
    
    1) На выходе я получаю List. Могу я его на ходу преобразовать в List
    ? Пробовал различные вариации преобразований, но получаю ругань компилятора.
    
    2)Можно ли получить не просто коллекцию List, а ,допустим, List,
    где string- это какой-нибудь из атрибутов XElement ?
        
    


    Ответы

    Ответ 1



    XElement - это наследник XNode, поэтому список узлов в список элементов можно преобразовать операцией .OfType: var ext = xDoc.XPathSelectElements("*//nodes").DescendantNodes().OfType().ToList(); Но в вашем случае проще с самого начала выбрать Descendants() вместо DescendantNodes(): var ext = xDoc.XPathSelectElements("*//nodes").Descendants().ToList(); А еще проще можно сделать вот так: var ext = xDoc.XPathSelectElements("*//nodes//*").ToList(); Или вот так: var ext = xDoc.Root.Descendants("nodes").Descendants().ToList(); По второму вопросу - такой коллекции как List, не существует. Поэтому не вполне понятно что вы пытаетесь получить. Возможно, вам нужен словарь: var ext = xDoc.Root.Descendants("nodes").Descendants().ToDictionary(x => (string)x.Attribute("name")); Или Lookup: var ext = xDoc.Root.Descendants("nodes").Descendants().ToLookup(x => (string)x.Attribute("name"));

    четверг, 2 апреля 2020 г.

    Парсинг XSD С++

    #cpp #qt #xml #xsd

                        
    Привет всем. Возникла задача, на основе XML и XSD динамически подгружать интерфейс.
    Написал xml и xsd файл к этой xml. Загружаю xsd файл в память, проверяю по xsd схеме
    xml файл,с помощью библиотеки libxml2, выводит все хорошо или есть где нибудь ошибка,
    но к примеру допустим все хорошо. Следующим этапом провожу парсинг xml файла средствами
    Qt (QXmlReader), создаю необходимые формы. Теперь необходимо, как то достать из xsd
    схемы значения ограничения диапазона, типы и другие атрибуты. К примеру в xsd схеме
    хранится диапазон для формы, пример маленького кусочка большого файла привел ниже:
    
    
     
      
         
         
      
     
    
    
    
    Вот мне нужно из определённого элемента в XSD достать: 
    1) тип integer
    2) minInclusive(мин значение диапазона) - 0
    3) maxInclusive(максимальное значение диапазона) - 120
    
    На основе этих значение для формы к примеру spinBox будут заданы ограничения 1) если
    получили тип integer в результате парсинга xsd, будет создан объект класса QIntValidate
    (для делегата) и будет установлен setRange(0,120); для этого spinBox
    
    Возможно есть ли какие нибудь библиотеки для парсинга самой XSD, а не только XML?
    Может кто то покажет пример xsd в libxml2, но я не нашел. Возможно кто то знает хорошие
    примеры, как это можно сделать или делал это когда-нибудь средствами Qt. 
        
    


    Ответы

    Ответ 1



    Схема XSD - это тоже файл в формате XML. Вы знаете его структуру. Можете тем-же парсером его парсить. Например, ищете узел с тэгом "xs:element" и со свойством "name" равному "age". В нём - узел с тэгом "xs:simpleType". В нём узел с тегом "xs:restriction". В нем в узлах с тегами "xs:minInclusive" и "xs:maxInclusive" берёте из свойства "value" необходимые вам значения ограничений.

    Ответ 2



    Посмотрите "CodeSynthesis XSD", может подойдёт. Есть более мощный продукт Altova XSD Editor (коммерческий), тоже c++ умеет генерить

    вторник, 31 марта 2020 г.

    Как задать android:layout_marginLeft, android:layout_marginStart кнопке через код?

    #java #android #xml

    
    У меня есть динамически-создаваемая кнопка. Мне нужно чтобы после ее создания она
    была после определенного элемента. В xml я делал это так:
    
      

    понедельник, 30 марта 2020 г.

    Вывод XML на консоль - отсутствует заголовок xml файла C#

    #c_sharp #xml #binary

    
    Создал XML файл с помощью класса  XDocument. Вывожу готовую Xml в Консоль, но не
    вижу там xml заголовка в начале файла. Если его сохранить на диск, то заголовок присутствует.
    Почему так происходит? И как можно его туда добавить?
    
    XDocument xdoc = new XDocument(
    
            new XDeclaration("1.0", "Windows-1251","yes"),
            new XElement("Product",
                new XElement ("prequest",
                new XElement("req",
                new XElement("AddressReq",
                    new XElement ("street","Горького"),
                    new XElement ("houseNumber","1"),
                    new XElement("apartment", "38"),
                    new XElement("city", "Магадан"),
                    new XElement("postal", "685000"),
                    new XElement("addressType", "1")),
                new XElement("AddressReq",
                    new XElement("street", "Горького"),
                    new XElement("houseNumber", "1"),
                    new XElement("apartment", "38"),
                    new XElement("city", "Магадан"),
                    new XElement("postal", "685000"),
                    new XElement("addressType", "1")),
                new XElement("IdReq",
                    new XElement("idNum", "273"),
                    new XElement("idType","21"),
                    new XElement("seriesNumber", "64"),
                    new XElement("issueCountry", "г. Магадан"),
                    new XElement("issueDate", "2006-03-18"),
                    new XElement("issueAuthority", "ОВД")
                ),
                new XElement("IdReq",
                    new XElement("idNum", "1"),
                    new XElement("idType", "32")
                ),
                new XElement("InquiryReq",
                    new XElement("ConsentReq",
                     new XElement("consentFlag", "Y"),
                     new XElement("consentDate", "2016-01-20"),
                     new XElement("consentExpireDate", "2021-10-21"),
                     new XElement("consentPurpose", "4"),
                     new XElement("otherConsentPurpose", "Job pre-screening"),
                     new XElement("reportUser", "DG Human Resources Incorporated"),
                     new XElement("liability", "Y")
                    ),
                     new XElement("inqPurpose", "01"),
                     new XElement("inqAmount", "10000"),
                     new XElement("currencyCode", "usd")
                ),
                 new XElement("PersonReq",
                    new XElement("name1", "К"),
                    new XElement("first", "Г"),
                    new XElement("paternal", "Г"),
                    new XElement("gender", "1"),
                    new XElement("birthDt", "1900-00-00"),
                    new XElement("placeOfBirth", "Москва")
                ),
                 new XElement("RequestorReq",
                    new XElement("MemberCode", "V"),
                    new XElement("UserID", "V"),
                    new XElement("Password", "1")
                ),
                 new XElement("RefReq",
    
                    new XElement("product", "CHST")
                ),
                 new XElement("IOType","B2B"),
                 new XElement("OutputFormat", "xml"),
                 new XElement("lang", "ru")
                ))               
                ))
    
    
    Вывод в консоль :
    
    xdoc.Save("C:\\file.xml");  //В сохраненном файле xml есть заголовок
            byte[] byteArray = Encoding.GetEncoding(1251).GetBytes(xdoc.ToString());
            BinaryWriter write = new BinaryWriter(File.Open("C:\\file.dat", FileMode.OpenOrCreate));
            write.Write(byteArray); //а вот в бинарном файле нет.
    
            Console.WriteLine(xdoc); //Если вывести сам xdoc то тут тоже нет заголовка.
             
            Console.ReadKey();
    
        
    


    Ответы

    Ответ 1



    Метод ToString у класса XDocument не выводит заголовок xml. Поэтому его нет в бинарном файле. Когда вы пишете Console.WriteLine(xdoc) - тут тоже вызывается ToString. Хотите получить заголовок в консоли, используйте xdoc.Save(Console.Out); Не пугайтесь, что encoding выведется другой. Кодировка будет такой, какую поддерживает консоль.

    Ответ 2



    Как верно заметили в соседнем ответе, XDocument.ToString() не отображает декларацию документа, но ее можно вывести отдельно: Console.WriteLine(xdoc.Declaration); Console.WriteLine(xdoc);

    Замена содержимого в XML в среде MS SQL

    #sql #sql_server #xml #xquery

    
    Коллеги, есть такая задача по замене значений в поле data, где сообственно сам XML
    документ.
    Необходимо, чтобы производилась замена @yandex.ru на @mail.ru (логин,email) значения
    по всем записям. Записей в таблице более 100. Каким образом реализовать проход по всем
    записям с последовательной заменой значений?
    
    Структура таблицы:
    
    collaborator (id int, data xml)
    
    
    Пример содержимого XML документа:
    
    
    5759501959199724993
    Рязанцев
    Дмитрий
    Александрович
    499-0000000
    ryazancevda@mail.ru
    ryazancevda@mail.ru
    
    
    
    Запрос:
    
    declare @xml xml 
    select @xml=data from collaborator
    declare @email varchar(80)
    declare @login varchar(80)
    
    begin
    update collaborator
        set @email = @xml.value('(/collaborator/email)[1]', 'varchar(80)')
        set @email = replace(@email, 'yandex.ru', 'mail.ru')
        set @xml.modify('
           replace value of (/collaborator/email/text())[1]
           with sql:variable("@email")
       ')
    
        set @login = @xml.value('(/collaborator/login)[1]', 'varchar(80)')
        set @login = replace(@login, 'yandex.ru', 'mail.ru')
        set @xml.modify('
           replace value of (/collaborator/login/text())[1]
           with sql:variable("@login")
       ')
    
     end
    select @xml;
    
        
    


    Ответы

    Ответ 1



    Я думал, думал... Придумал такое: update collaborator set data.modify(' replace value of (/collaborator/email/text())[1] with concat( substring( (/collaborator/email/text())[1], 1, string-length((/collaborator/email/text())[1]) - string-length("mail.ru")), "yandex.ru") ') where data.exist('/collaborator/email/text()[contains(., "mail.ru")]') = 1 update collaborator set data.modify(' replace value of (/collaborator/login/text())[1] with concat( substring( (/collaborator/login/text())[1], 1, string-length((/collaborator/login/text())[1]) - string-length("mail.ru")), "yandex.ru") ') where data.exist('/collaborator/login/text()[contains(., "mail.ru")]') = 1 Получается два запроса. Это лучшее, что удалось придумать. Обновить за раз можно только одну строку. К тому же набор функций XQuery весьма ограничен, поэтому пришлось изобретать такую сложную конструкцию с использованием concat/substring/string-length. Если точно известно, что все логины и емейлы заканчиваются на "mail.ru", то можно убрать условие where data.exist. В коде неоднократно повторяются однотипные конструкции вида (/collaborator/login/text())[1], что весьма громоздко. Не знаю, может есть способ использовать переменную let $login := ... и далее её подставлять?

    Ответ 2



    Если XML имеет такую простую структуру, то можно обойтись одним UPDATE: UPDATE t SET t.data = data.query(' element collaborator { for $a in (/collaborator/*) return if (local-name($a) = "email") then element email { text { sql:column("d2.email") } } else if (local-name($a) = "login") then element login { text { sql:column("d2.login") } } else $a } ') FROM collaborator t CROSS APPLY ( SELECT email = t.data.value('(/collaborator/email/text())[1]', 'nvarchar(400)'), login = t.data.value('(/collaborator/login/text())[1]', 'nvarchar(400)') ) d CROSS APPLY ( SELECT email = REPLACE(d.email, N'@mail.ru', N'@yandex.ru'), login = REPLACE(d.login, N'@mail.ru', N'@yandex.ru') ) d2 т.е. XML каждой строки данных пересобирается с помощью FLWOR, но в элементах email и login значения заменяются выражениями возвращаемыми REPLACE.

    четверг, 19 марта 2020 г.

    Динамическое подключение и использование java-классов

    #xml #jaxb #java #xsd

    
    Продолжение вопроса. Узнал и разобрался как XJC генерирует классы для типов. Отсюда
    вопрос - как динамически подключать и использовать их?
        
    


    Ответы

    Ответ 1



    Я вопрос понял. Вопрос сложный. По сути речь идет о том, чтобы в рантайме скомпилировать исходники и прицепить к аппе - фактически состоит из 2-х частей: Как подключить класс в рантайме Как скомпилировать класс в рантайме Если первый решается загрузчиком класса - конструкцией типа Class.forName() в связке с ClassLoader, то второй вопрос сложнее, но при использовании Java >= 6 это решаемо: String fileToCompile = "MyClass.java"; JavaCompiler compiler = javax.tools.ToolProvider.getSystemJavaCompiler(); int compilationResult = compiler.run(null, null, null, fileToCompile); Если Java < 6 то есть только недокументированные возможности (я уже забыл какие).

    Парсинг XML

    #xml #php #синтаксический_анализ

    
    Есть xml файл test.xml, в котором содержится:
    
    
    1
    20121126 03:57:10
    test
    Rxxx
    WMIDxxx
    0
    3
    95.28.75.19
    
    null
    
    
    null
    
    
    -1
    
    
    
    0
    
    
    
    Вот как, средствами php, получить значение amount?    
    


    Ответы

    Ответ 1



    $xml = new DomDocument; $xml -> ValidateOnParse = true; $xml -> load('test.xml'); $amount = $xml -> getElementsByTagName('amount')->item(0)->nodeValue;

    Ответ 2



    SimpleXML

    Ответ 3



    Вот здесь пример.

    воскресенье, 15 марта 2020 г.

    android ImageView разметка

    #android #xml #изображения #разметка

    
    Доброго времени суток. Подскажите, можно ли используя только лишь Layout-ы, не используя
    Surface, Canvas и прочее, сделать подобное ( см. аттач )? Имеется ввиду именно расположение
    контроллов с поддержкой landscape. Спасибо!
    
        
    


    Ответы

    Ответ 1



    Да, можно. Нужна комбинация 5-6 (может и больше) вложенных друг в друга лейаутов. На верхнем уровне LinearLayout с горизонтальной ориентацией, далее в него 2 вложенных LinearLayout один с аватаркой, а второй (справа) содержащий все остальное. В правом надо будет организовать RelativeLayout, где слева большой ImageView а справа снизу Button. Мелкие ImageView сгруппировать в TableView с двумя строчками, в каждой строчке еще по одному RelativeLayout Это как бы версия, возможно она не сработает, а может и сработает. Но смысл простой - комбинацией различных типов лейаутов всегда можно нарисовать практически все что угодно. Еще ни разу не было, чтобы я не смог нарисовать какой угодно сложный набор. Дерзайте. Update Большой круг с фотиком можно например сделать так: Где drawable/ball: В итоге получится примерно так:

    Ответ 2



    А можно и без 5-6 наложений, надо всего лишь использовать RelativeLayout. Делал на скорую руку, так что сильно не пинайте. Update Для этих кругов используйте стиль из ответа @Barmaley и подключайте его через android:background

    Зачем придумали RFC5261, если существует XSLT?

    #xml

    
    RFC5261 - содержит описание формата для XML-патчей. Но в принципе, XSLT ведь тоже
    позволяет преобразовать один XML-документ в другой? Что помешало им использовать существующий
    стандарт? Это NIH-синдром?
    
    При помощи XSLT можно выполнять замены:
    https://stackoverflow.com/questions/5351008/xsltcan-i-update-value-in-xml-node-using-xslt
    и это не у одного меня такой вопрос - https://stackoverflow.com/questions/1771351/xml-diff-how-to-generate-xml-diff-using-xslt
        
    


    Ответы

    Ответ 1



    RFC5261(An Extensible Markup Language (XML) Patch Operations Framework Utilizing XML Path Language (XPath) Selectors) - предложенный компанией Nokia декларативный формат на базе XML, созданный прежде всего для использования в HTTP-методе PATCH. При помощи всего 3-х тегов-операторов, он позволяет приложению задавать инструкции, с помощью которых веб-сервис(REST) должен будет изменить некий документ на сервере. Обработка этого простого формата занимает буквально пару сотню строчек кода, и при грамотной реализации, он позволяет выполнять сразу множество параллельных изменений в одном документе при обработке множества различных HTTP-запросов PATCH. XSLT(XSL Transformations) - созданный консорциумом W3C формат на базе XML, предназначенный для описания инструкций по созданию из документов одного формата, документов в формате другом. Это огромный, тяжело реализуемый формат, предназначенный для решения задач совсем другого рода, а именно - для массовых преобразований XML-документов из одного формата в другой.

    пятница, 13 марта 2020 г.

    Локализованные ресурсы(масивы) и их использывание

    #java #android #xml #android_sdk

    
    Как правильно реализовать роботу локализованных ресурсов?
    Делаю так: создаю новый файл ресурсов strings через ПКМ-New-Valuse и там задаю странну,
    ну и язык. Получаю уже два файла(правда флаг не тот, но не важно, надеюсь на функционал
    не влияет).
    
    
    Имеются такие массивы:
    
    
    
        Тефтели
        Яблоко
        Пельмени
        Ананас
        Капуста
        Кабачок
        Опельсин
        Лемон
        Желе
        Мед
        Сосиска
        Пицца
        Лук
        Лемонад
        Чай
    
    
    
    
    
        Noisettes
        Apple
        Pelmeni
        Pineaple
        Cabbage
        Squash
        Orange
        Lemon
        Jelly
        Honney
        Sausage
        Pizza
        Onion
        Lemonade
        Tea
    
    
    
    
    Делаю так: 
    
    String[] food = getResources().getStringArray(R.array.food);
    
    
    И вот вопрос, правильно ли я это делаю? А то проверить не получается.
        
    


    Ответы

    Ответ 1



    Вы все делаете правильно. Стоит заметить, что в Android Studio есть встроенный редактор локализации - Translation Editor, который сильно облегчает работу, как по созданию новой локализации, так и редактированию существующей. Инструмент сам создаст необходимые папки и файлы, вам требуется только выбрать язык и, собственно, заполнить сам перевод в таблице строковых ресурсов. Иконка редактора - синий глобус, попасть туда можно из визуального редактора разметки, открыв любой Layout или нажав на кнопку-ссылку Open Editor, открыв любой файл строковых ресурсов, так же можно кликнуть правой кнопкой мыши на любом файле строковых ресурсов и выбрать Open Translations Editor

    понедельник, 9 марта 2020 г.

    установить прозрачность для активити, чтобы было видно нижнее активити

    #java #android #xml

    
    есть два активити , одно открывается сверху другого и на нём gridview, хочу чтобы
    верхнее было полупрозрачным (не полностью прозрачное, не android:style/Theme.Translucent)
    , как загрузить фоновую картинку я понял android:background="@drawable/picture" . 
    И вот везде на вопрос как сделать его прозрачным, говорят поставить android:alpha="0.5"
    , ну и что ? получается просто СВетлая картинка, но не прозрачная , через неё не видно
    элементов нижнего активити.. Еще говорят установить color ARGB , где A отвечает за
    прозрачность, но получается такая же Светлая картинка, не прозрачная.. 
    
    
    
    
    
    В манифесте я даже не знаю  , что еще пробовать , пока вот 
        введите  
         сюда код
        
    


    Ответы

    Ответ 1



    Для реализации того что хотите лучше использовать фрагменты (либо другие варианты, PopupWindow например). UPD. А действительно, Вы правы. Добавил стиль: В colors.xml #55000000 В таком случае получился результат: Можно и android:alpha="0.5" в разметку добавить. Но по жизненному циклу не вызвался onStop у первой Activity. Логи: E/onPause: onPause E/onCreate2: onCreate2 E/onResume2: onResume2 При повороте экрана: E/onPause2: onPause2 E/onStop2: onStop2 E/onDestroy2: onDestroy2 E/onCreate2: onCreate2 E/onResume2: onResume2 E/onStop: onStop E/onDestroy: onDestroy E/onCreate: onCreate E/onResume: onResume E/onPause: onPause

    воскресенье, 8 марта 2020 г.

    проблема при десериализации пустого элемента xml

    #c_sharp #xml #xsd

    
    есть простой хмл
    
     
      
         
        
      
     
    
    
    проблема в том что Dprtm_code может быть как заполнен 234234234
    так и нет . создал схему :
    
    //...
    
    
    //...
    
    
    создал класс и в нем описал эти поля: 
    
    //...
    private long? dprtm_codeField;    
    private string dprtm_nameField;
    
    [XmlElementAttribute(IsNullable=true)]
    public long? Dprtm_code {
        get {
            return this.dprtm_codeField;
        }
        set {
            this.dprtm_codeField = value;
        }
    }
    public string Dprtm_name {
        get {
            return this.dprtm_nameField;
        }
        set {
            this.dprtm_nameField = value;
        }
    }
    //...
    
    
    но при десериализации хмл с пустым кодом  падает ошибка
    приведения типов. собственно вопрос: как правильно объявить елементы которые могут
    быть пустыми в xml?
        
    


    Ответы

    Ответ 1



    Xml, соответствующий приведённой схеме и десериализующийся в приведённый класс, должен выглядеть следующим образом: То есть, обязательно должен быть атрибут nil из указанного пространства имён. Его корректно обрабатывает XmlSerializer (полагаю, что используется именно он). При сериализации атрибут xsi:nil будет добавляться автоматически при необходимости. Без этого атрибута валидация по схеме тоже не проходит.

    Не могу разобраться с записью и чтением XML

    #c_sharp #xml

    
    Есть документ следующего вида:
    
      
    
      
    value value value
    value value value
    Стоит задача записывать в определенную категорию пару key-value, и также читать из определенной категории такую пару. Я запутался в бесконечных XmlDocument, XPathNavigator и прочем, помогите пожалуйста разобраться.Язык С#.


    Ответы

    Ответ 1



    Если не хотите мучиться со всеми особенностями XML-DOM, то попробуйте использовать LiNQtoXML. Пространство имен System.Xml.Linq, Основной рабочий класс - XElement. Загрузка исходного Xml: var myDoc = XElement.Load("myFile.xml"); Также можно использовать статический метод XElement.Parse(string), если в качестве источника используется строка. Ищем нужный элемент: var element = myDoc.Descendants("elementName").FirstOrDefault(); Читаем и пишем значение элемента: var elValue = element?.Value; element.Value = "newValue";//элемент должен существовать Читаем и пишем атрибут: var attrValue = element?.Attribute("attrName")?.Value; element.Attribute("attrName").Value = "newAttrValue"; Добавим вложенный элемент c текстовым значением и атрибутом element.Add(new XElement("subElement", "value", new XAttribute("attrName","AttrValue")); Сохраним результат на диск myDoc.Save("fileName") Как видите все довольно прозрачно и понятно. XMLtoLiNQ полностью поддерживает классическую XML-DOM, но делает это изящнее чем более старый подход, реализованный в XmlDocument и сопутствующих классах. Документация по ссылкам ниже содержит примеры в достаточном количестве чтобы разобраться и ссылки на описание сопутствующих классов. Класс XDocument Класс XElement

    Ответ 2



    Различные способы чтения xml, а также если неизвестно количество ключей, последний указанный способ using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.Linq; using System.Linq; using System.Xml.Serialization; namespace ConsoleApplication20 { [XmlRoot("Settings")] public class XmlRecordList { [XmlElement("section")] public List Items { get; set; } } public class XmlRecord { [XmlAttribute("idCat")] public string idCat { get; set; } [XmlElement("key1")] public string key1 { get; set; } [XmlElement("key2")] public string key2 { get; set; } [XmlElement("key3")] public string key3 { get; set; } } public class SomeOtherClass { public string idCat { get; set; } public string key1 { get; set; } public string key2 { get; set; } public string key3 { get; set; } } public class SomeOtherClass2 { public string idCat { get; set; } public Dictionary keys { get; set; } } class Program { static void Main(string[] args) { XmlRecordList result = null; using (StreamReader streamReader = new StreamReader("1.xml")) { var ser = new XmlSerializer(typeof(XmlRecordList)); result = (XmlRecordList)ser.Deserialize(streamReader); } using (StreamWriter streamWriter = new StreamWriter("2.xml")) { var ser = new XmlSerializer(typeof(XmlRecordList)); ser.Serialize(streamWriter, result); } //или Linq List Records = (from xmlInput in XDocument.Load("1.xml").Descendants("section") select new SomeOtherClass { idCat = xmlInput.Attribute("idCat").Value, key1 = xmlInput.Element("key1").Value, key2 = xmlInput.Element("key2").Value, key3 = xmlInput.Element("key3").Value }).ToList(); //если количество ключей неизвестно, то можно их загрузить в коллекцию следующим образом List Settings = (from xmlInput in XDocument.Load("1.xml").Descendants("section") select new SomeOtherClass2 { idCat = xmlInput.Attribute("idCat").Value, keys = xmlInput.Descendants().ToDictionary(x=>x.Name.ToString(), x=>x.Value.ToString()) }).ToList(); } } }

    среда, 4 марта 2020 г.

    Golang xml encoding=“windows-1251”

    #xml #golang #utf_8 #xmlparser #cp1251

    
    Пишу парсер для xml файлов, но проблема в том, что в файле кодировка:
    encoding="windows-1251".
    Когда перевел кодировку в ut8 то следующем кодом смог распарсить документ.  
    
    for _, file := range files {
                _, filename := utils.Unzip("/Users/farex/upload/"+file.Filename, "/Users/farex/upload/")
                _ = filename
                ///---------- Open our xmlFile-----------------------
                for _, file := range filename {
                    xmlFile, err := os.Open("/Users/farex/upload/" + file)
                    // if we os.Open returns an error then handle it
                    if err != nil {
                        fmt.Println(err)
                    }
                    fmt.Println("Successfully Opened " + file)
    
                    if utils.Cut(file, 1) == "H" {
    
                        defer xmlFile.Close()
    
                        byteValue, _ := ioutil.ReadAll(xmlFile)
                        var zl_list models.ZL_LIST
    
                        xml.Unmarshal(byteValue, &zl_list)
    
                        fmt.Println("---ZGLV---")
                        fmt.Println("VERSION" + zl_list.ZGLV[0].VERSION)
                        fmt.Println("DATA" + zl_list.ZGLV[0].DATA)
                        fmt.Println("FILENAME" + zl_list.ZGLV[0].FILENAME)
                        fmt.Println("SD_z" + zl_list.ZGLV[0].SD_Z)
    
    
    Это все работает, но задача парсить не Документы в формате utf8 , а в cp-1251.
    Как можно "конвертировать" cp-1251 в utf-8 ?
    Добавил меторд:
    
    func EncodeWindows1251(ba []uint8) []uint8 {
        enc := charmap.Windows1251.NewEncoder()
        out, _ := enc.String(string(ba))
        return []uint8(out)
    }
    
    
    и соответственно вызываю его:
    
    byteValue, _ := ioutil.ReadAll(xmlFile)
    a := EncodeWindows1251(byteValue)
    var zl_list  models.ZL_LIST
    xml.Unmarshal(a, &zl_list)
    
    
    Тоже не работает...
    Но если из документа убрать строку .
    То все работает и документ парсится... Неужели придется регуляркой удалять эту строчку
    в документе?
    
    Добавил метод наисанный ниже и за импортировал.        "golang.org/x/text/encoding/charmap".
    Но:
    
    
    Образец файла xml тут кодировка cp-1251
        
    


    Ответы

    Ответ 1



    Для этого существует поле Decoder.CharsetReader: // CharsetReader, if non-nil, defines a function to generate // charset-conversion readers, converting from the provided // non-UTF-8 charset into UTF-8. If CharsetReader is nil or // returns an error, parsing stops with an error. One of the // the CharsetReader's result values must be non-nil. CharsetReader func(charset string, input io.Reader) (io.Reader, error) Использовать можно так: d := xml.NewDecoder(xmlFile) d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { switch charset { case "windows-1251": return charmap.Windows1251.NewDecoder().Reader(input), nil default: return nil, fmt.Errorf("unknown charset: %s", charset) } } err := d.Decode(&zlList)