Tehnik-ast.ru

Электро Техник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Что такое XML

Что такое XML

Когда мы говорили о разметке в Маркдауне, то там смысл был такой: есть текст, а мы его размечаем специальными символами, чтобы он хорошо выглядел. Теперь перейдём на этап выше — будем форматировать данные на уровне логики с помощью XML.

👉 XML нужен для работы с техническим текстом, где всё строго, упорядоченно и логично. Его, конечно, можно применить и к художественному тексту, но выйдет так себе.

Что такое XML

XML — это сокращение от eXtensible Markup Language, а переводится это как «Расширяемый язык разметки». Смысл XML в том, чтобы выстроить внутри документа логическую структуру — чтобы было видно, что к чему относится и как всё связано между собой, в каком формате представлены данные.

С помощью XML можно:

  • записать оргструктуру компании или любую другую иерархию — «этот подчиняется тому»;
  • разметить текст по смыслу — «тут важное, там второстепенное, вот это поясняет вон то»;
  • хранить типовые данные — например, имена артистов, названия их альбомов и треки; или настройку какой-нибудь программы, или скрипты;
  • разметить веб-страницу по смыслу и отдать эту разметку алгоритму, который сам нарисует дизайн;
  • разметить текст для дальнейшего машинного обучения;
  • хранить результаты работы программ, которые работают с текстом — например, ничто не мешает текстовым редакторам хранить документы со всем оформлением в формате XML.

И многое другое, где нужен порядок, структура и работа с текстовыми данными.

Что такое XML

Сила XML

Сила XML в том, что данные здесь представляются как обычный текст, размеченный тегами (как в HTML). Например, чтобы записать оргструктуру компании в XML, не нужно рисовать схему в графическом редакторе, достаточно правильно разметить текст с именами и должностями. Файлики получаются маленькими, из легко обрабатывать.

И ещё сила XML в том, что эти данные может прочитать и обработать компьютер. Например, если мы передаём ему оргструктуру компании, компьютер поймёт её: кто кому подчиняется, что куда входит и т. д. Для сравнения: если скормить компьютеру схему, нарисованную в графическом редакторе, он её не поймёт.

Если XML хорошо составлен, его также может понять человек.

Как устроен XML

Внешне XML очень похож на HTML — в нём тоже всё пишется в угловых скобках, есть закрывающие теги и параметры: аналоги классов и стилей. Но, в отличие от HTML, здесь нет обязательных тегов или вообще каких-то обязательных элементов. Объясним, как это работает, на примере.

Допустим, у нас есть такой текст, из которого нужно сделать XML-документ:

«По состоянию на 21 октября 2021 журнал Код работает и в редакции есть главред Максим Ильяхов и автор Михаил Полянин»

Первое, что нам нужно сделать — написать в документе, что перед нами именно XML:

Этот параметр говорит, что ниже будет XML-разметка. Иначе программа-обработчик не будет знать, что с ним делать — рисовать как HTML или выводить как просто текст?

Внутри XML-документа всегда есть корневой элемент — внутри него лежит всё остальное. Так как в XML мы придумываем названия для разметки сами, то пусть этот элемент будет называться actual (это название может быть любым):

👉 Комментарии в XML такие же, как в HTML.

Теперь разбираем содержимое. Первое, что мы видим в документе, — это дата, поэтому можем сделать отдельный раздел со статусом издания. В него будет входить значение Active (издание работает) и два параметра — дата последней проверки и статус этой проверки. Сам элемент мы назовём status:

Это очень похоже на стили и классы в HTML, но работает иначе: мы просто указываем параметры и их значения, а не подключаем какие-то внешние данные или правила.

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

Это история о том, что XML — это просто полочки, на которые мы раскладываем данные. Какие там данные — ему не важно.

Читайте так же:
Какое давление для гайковерта

Добавим ниже сведения про название журнала:

Новый элемент мы назвали media — так человеку будет проще прочитать и понять, что внутри, а компьютеру всё равно.

Последнее — добавим информацию о составе редакции. Обратите внимание, что появилась вложенная структура: внутри элемента person есть три дочерних элемента: name, lastname и role. Это значит, что они относятся к родительскому элементу, а не живут сами по себе:

Таким способом можно разобрать на логические составляющие любой технический или информационный документ — от инструкции к чайнику до ежегодного отчёта для инвесторов. Главное — не запутаться в элементах и чётко понимать, что от чего зависит и куда вкладывается.

Где нужен XML

XML применяют везде, где нужно выделить логическое содержимое документа, чтобы потом его можно было как-то обработать. Например, если у вас есть размеченный XML-файл с названием и характеристиками товаров, то можно научить сервер обрабатывать его как угодно: выводить название в заголовке или простым текстом, понимать, где лежит цена, откуда брать описание и к какому разделу отнести этот товар.

Ещё XML применяют в API, когда идёт ответ от сервера в виде XML-файлов.

Что дальше

В другой статье придумаем свой XML-формат и научим сервер с ним работать.

Файл pom.xml

Информация для программного проекта, поддерживаемого Maven, содержится в XML-файле с именем pom.xml (от Project Object Model). При исполнении Мавен проверяет прежде всего, содержит ли этот файл все необходимые данные и все ли данные синтаксически правильно записаны.

Пример 1. Файл pom.xml

1. Корневой элемент

Корневой элемент <project>, в котором прописана схема облегчающая редактирование и проверку, и версия POM.

Пример 2. Корневой элемент

2. Заголовок

Внутри тега project содержится основная и обязательная информация о проекте:

Пример 3. Заголовок

В Maven каждый проект идентифицируется парой groupId, artifactId.

Во избежание конфликта имён, groupId — наименование организации или подразделения и обычно действуют такие же правила, как и при именовании пакетов в Java — записывают доменное имя организации или сайта проекта.

artifactId — название проекта.

Внутри тега version хранится версия проекта.

Тройкой groupId, artifactId, version (далее — GAV) можно однозначно идентифицировать jar файл приложения или библиотеки. Если состояние кода для проекта не зафиксировано, то в конце к имени версии добавляется «-SNAPSHOT» что обозначает, что версия в разработке и результирующий jar файл может меняться.

3. Тег packaging

Тег <packaging> определяет какого типа файл будет создаваться как результат сборки. Возможные варианты pom, jar, war, ear.

Тег является необязательным. Если его нет, используется значение по умолчанию — jar.

4. Описание проекта

Также добавляется информация, которая не используется самим Maven, но нужна для программиста, чтобы понять, о чём этот проект:

Пример 4. Описание проекта

5. Зависимости

Зависимости — следующая очень важная часть pom.xml — тут хранится список всех библиотек (зависимостей) которые используются в проекте. Каждая библиотека идентифицируется так же как и сам проект — тройкой groupId, artifactId, version (GAV). Объявление зависимостей заключено в теге <dependencies>. </dependencies>.

Кроме GAV при описании зависимости может присутствовать тег <scope>. Он задаёт, для чего библиотека используется. В данном примере говорится, что библиотека с GAV junit:junit:4.4 нужна только для выполнения тестов.

Пример 4. Зависимости

6. Тег <build>

Тег <build> не обязательный, так как существуют значения по умолчанию. Этот раздел содержит информацию по самой сборке:

  • где находятся исходные файлы,
  • где ресурсы,
  • какие плагины используются.
Пример 5. Тег <build>

<sourceDirectory> — определяет, откуда Maven будет брать файлы исходного кода. По умолчанию это src/main/java, но вы можете определить, где это вам удобно. Директория может быть только одна (без использования специальных плагинов).

<recources> и вложенные в неё теги <recource> определяют, одну или несколько директорий, где хранятся файлы ресурсов. Ресурсы в отличие от файлов исходного кода при сборке просто копируются. Директория по умолчанию src/main/resources.

<outputDirectory> — определяет, в какую директорию компилятор будет сохранять результаты компиляции — *.class файлы. Значение по умолчанию — target/classes.

<finalName> — имя результирующего jar (war, ear . ) файла с соответствующим типу расширением, который создаётся на фазе package. Значение по умолчанию — artifactId-version.

Maven плагины позволяют задать дополнительные действия, которые будут выполняться при сборке. Например, в приведённом примере добавлен плагин, который автоматически делает проверку кода на наличие «плохого» кода и потенциальных ошибок.

Читайте так же:
Автоматическая аргонодуговая сварка плавящимся электродом

Xml.bad

  • accounting
  • ajax-framework
  • application-framework
  • audio-editor
  • automation
  • big-data
  • blog-engine
  • browser
  • build-tool
  • business-process-management
  • cache
  • charting-library
  • chat-server
  • code-coverage
  • collaboration
  • column-database
  • document-management
  • data-extraction
  • database
  • e-commerce
  • email-client
  • embedded-database
  • enterprise-search
  • erp
  • facebook-alternative
  • faq-system
  • finance
  • forum-software
  • ftp
  • full-text-search
  • game-engine
  • geocoding
  • git
  • graph-database
  • healthcare-information-system
  • helpdesk
  • html-parser
  • html-to-text
  • human-resource-management
  • identity-management
  • image-compression
  • information-retrieval
  • instant-messaging
  • intrusion-detection-system
  • issue-tracking
  • java-framework
  • java-games
  • jquery-plugin
  • json
  • jvm
  • key-management
  • key-value-store
  • language-detection
  • linux-operating-system
  • linux-tools
  • log-analysis
  • mail-client
  • mail-server
  • mailing-list
  • media-player
  • media-server
  • message-queue
  • micro-blogging
  • mobile-framework
  • natural-language-processing
  • network-management
  • networking-library
  • neural-network
  • no-sql
  • nodejs
  • oauth
  • object-database
  • ocr
  • office-suite
  • online-shopping
  • operating-system
  • orm
  • package-manager
  • pdf-library
  • personnel-finance
  • photo-management
  • programming-language
  • proxy-server
  • qa-tools
  • qr-code
  • question
  • records-management
  • relational-database
  • reporting-tool
  • rrdtool
  • school-management
  • screen-capture
  • search-engine
  • server-monitoring
  • shopping-cart
  • skype-alternative
  • sms-library
  • social-networking
  • testing-tool
  • text-extraction
  • text-to-speech
  • ticketing
  • twitter-client
  • ubuntu-fork
  • uml-tool
  • unit-testing
  • url-shortning-service
  • version-control
  • video-cms
  • video-conference
  • video-player
  • virtualization
  • visualization
  • voip-server
  • vpn
  • web-analytics
  • web-application-framework
  • web-browser
  • webcrawler
  • webserver
  • wysiwyg-editor
  • xml-parser
  • xmpp
  • xps-viewer
  • zip
  • zlib

hexml — A bad XML parser

The name «hexml» is a combination of «Hex» (a curse) and «XML». The «X» should not be capitalised because the parser is more curse and less XML. Hexml may be suitable if you want to quickly parse XML, from known sources, and a full XML parser has been shown to be a bottleneck. As an alternative to hexml, which supports things like entities but is still pretty fast, see Pugixml (with a Haskell binding).

https://github.com/ndmitchell/hexml

Tags xml-parser xml haskell performant
Implementation C
License MIT
Platform

Related Projects

TagSoup — HTML/XML parser for Haskell

  • Haskell

TagSoup is a library for parsing HTML/XML. It supports the HTML 5 specification, and can be used to parse either well-formed XML, or unstructured and malformed HTML from the web. The library also provides useful functions to extract information from an HTML document, making it ideal for screen-scraping.

Apache Xerces for Perl XML Parser — Perl API to the Apache Xerces XML parser.

  • Perl

Perl API to the Apache Xerces XML parser.

Apache Xerces for Java XML Parser

  • Java

Xerces-J is a validating XML parser written in Java.

xml-stream — XML stream parser based on Expat. Made for Node.

  • Javascript

XmlStream is a Node.js XML stream parser and editor, based on node-expat (libexpat SAX-like parser binding). When working with large XML files, it is probably a bad idea to use an XML to JavaScript object converter, or simply buffer the whole document in memory. Then again, a typical SAX parser might be too low-level for some tasks (and often a real pain).

Professional XML Parser

ProXMLParser project aims at developing a Professional XML Parser using Microsoft .NET framework.

Nokogiri — HTML, XML, SAX, and Reader parser with XPath and CSS selector support

  • Ruby

Nokogiri (?) is an HTML, XML, SAX, DOM parser. Among Nokogiri’s many features is the ability to search documents via XPath or CSS3 selectors, XML/HTML builder, XSLT transformer. Nokogiri parses and searches XML/HTML using native libraries (either C or Java, depending on your Ruby), which means it’s fast and standards-compliant.

Expat

  • C

Expat is an XML parser library written in C. It is a stream-oriented parser in which an application registers handlers for things the parser might find in the XML document (like start tags).

pugixml — Light-weight, simple and fast XML parser for C++ with XPath support

  • C++

pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface variants and conversions between different Unicode encodings (which happen automatically during parsing/saving). pugixml is used by a lot of projects, both open-source and proprietary, for performance and easy-to-use interface.

Читайте так же:
Жак лебедка ручная шахтная

fast-xml-parser — Validate XML, Parse XML to JS/JSON and vise versa, or parse XML to Nimn rapidly without C/C++ based libraries and no callback

  • Javascript

This project welcomes contributors. If you have a feature you’d like to see implemented or a bug you’d liked fixed, the best and fastest way to make that happen is to implement it and submit a PR. Basic knowledge of JS is sufficient. Feel free to ask for any guidance. To use it from CLI Install it globally with -g option.

xml-rs — An XML library in Rust

  • Rust

xml-rs is an XML library for Rust programming language. It is heavily inspired by Java Streaming API for XML (StAX). This library currently contains pull parser much like StAX event reader. It provides iterator API, so you can leverage Rust’s existing iterators library features.

Arbica

  • C++

Arabica is an XML and HTML processing toolkit, providing SAX, DOM, XPath, and partial XSLT implementations, written in Standard C++.

RSS Parser and XML Parser for PHP 5+

  • PHP

A full XML Parser for PHP with RSS Parser specific functionsl; think of it as an interface to the PHP DOM which allows easy access to your XML based documents. Auto encoding conversion to UTF-8 + Array to XML Conversion. V3 is now a commercial product

posthtml — PostHTML is a tool to transform HTML/XML with JS plugins

  • Javascript

PostHTML is a tool for transforming HTML/XML with JS plugins. PostHTML itself is very small. It includes only a HTML parser, a HTML node tree API and a node tree stringifier. All HTML transformations are made by plugins. And these plugins are just small plain JS functions, which receive a HTML node tree, transform it, and return a modified tree.

Apache Axiom — XML object model supporting deferred parsing

  • Java

Apache Axiom is an XML object model supporting deferred parsing.

Piccolo

  • Java

Piccolo is a small, extremely fast XML parser for Java. It implements the SAX 1, SAX 2.0.1, and JAXP 1.1 (SAX parsing only) interfaces as a non-validating parser and attempts to detect all XML well-formedness errors. Piccolo was developed by Yuval Oren.

Libxml++

  • C

libxml++ is a C++ wrapper for the libxml XML parser library.

Fuzi — A fast & lightweight XML & HTML parser in Swift with XPath & CSS support

  • Swift

Fuzi is based on a Swift port of Mattt Thompson’s Ono(斧), using most of its low level implementaions with moderate class & interface redesign following standard Swift conventions, along with several bug fixes. Fuzi(斧子) means "axe", in homage to Ono(斧), which in turn is inspired by Nokogiri (鋸), which means "saw".

TagSoup — SAX-compliant parser in Java

  • Java

TagSoup, a SAX-compliant parser written in Java that, instead of parsing well-formed or valid XML, parses HTML as it is found in the wild: poor, nasty and brutish, though quite often far from short. TagSoup is designed for people who have to process this stuff using some semblance of a rational application design. TagSoup also includes a command-line processor that reads HTML files and can generate either clean HTML or well-formed XML that is a close approximation to XHTML.

htmlparser2 — forgiving html and xml parser

  • Javascript

A forgiving HTML/XML/RSS parser. The parser can handle streams and provides a callback interface. A live demo of htmlparser2 is available here.

XOM — XML object model in Java

  • Java

XOM is a new XML object model. It is a tree-based API for processing XML with Java that strives for correctness, simplicity, and performance, in that order.

Читайте так же:
Бур это инструмент или расходный материал

Провал [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: не удалось выполнить синтаксический анализ /data/app/vmdl1686600827.tmp/base.apk: поврежденный двоичный файл XML ]

Когда я обновил Android Studio 4 и android gradle plugin 4.0.0, я столкнулся со странной проблемой. My APK не развертывается ни на одном устройстве или эмуляторе. Позвольте мне объяснить, что я нахожу связанным с проблемой.

1-Когда я пытаюсь запустить приложение, нажав значок запуска на Android Studio, сборка успешно завершена. Потом ничего не происходит.

2-Когда я попытался развернуть built APK с adb install . Он показывает следующую ошибку.

Я также проверил adb logcat в другом сеансе terminal. Я нашел этот стек trace в отношении разбора apk. Я думаю, что это будет полезно для поиска решения.

Когда я анализирую встроенный APK с помощью анализатора APK, я вижу, что versionName неизвестен, а объединенный файл манифеста сломан и отсутствует.

Я предполагаю, что что-то не так при слиянии манифеста, но я не мог понять, в чем именно заключается проблема. У вас есть какие-нибудь идеи?

1 ответ

  • adb- [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]

При изменении файлов в извлеченном APK я повторно zip его, меняю расширение на .apk и устанавливаю следующим образом: $ adb install CustomAPK.apk 2831 KB/s (41896599 bytes in 14.450s) pkg: /data/local/tmp/CustomAPK.apk Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION] От чего это?

Я использую lessphp на своем сайте Joomla, я создаю шаблон, я хотел бы установить некоторые переменные и использовать их в файле less, для этого я использую класс autoCompileLess, но я получаю ошибку не удалось выполнить синтаксический анализ прошел в переменной @font: Это мой код lessphp.

Я как-то догадался. Я обновил сторонние версии зависимостей, а затем проблема устранена. В частности, обновление с com.admost.sdk:adcolony:4.1.3.a16 до com.admost.sdk:adcolony:4.1.4.a18 исправило мою проблему. Я думаю, что он не был совместим с плагином Gradle 4.0.0. Я предлагаю вам также проверить свои сторонние зависимости.

Чтобы определить, какая зависимость вызывает проблему, просмотрите объединенный манифест, проанализировав built APK.

Похожие вопросы:

Я пытался написать / разобрать файл xml в python. Теги очень просты <main> <data> abcdef </data> </main> Я написал этот xml, используя xml document writer от xml.dom.minidom.

Привет, я пытаюсь установить android sdk с eclipse, но он продолжает показывать мне эту ошибку Не удалось разобрать вывод ‘adb version’ Я следовал по следующим ссылкам, но не мог работать на меня Не.

Это отклик на ошибку: не удалось выполнить синтаксический анализ регулярных выражений шаблон "": слишком большие — компиляции не . Я снова сталкиваюсь с этой проблемой. Может ли.

При изменении файлов в извлеченном APK я повторно zip его, меняю расширение на .apk и устанавливаю следующим образом: $ adb install CustomAPK.apk 2831 KB/s (41896599 bytes in 14.450s) pkg.

Я использую lessphp на своем сайте Joomla, я создаю шаблон, я хотел бы установить некоторые переменные и использовать их в файле less, для этого я использую класс autoCompileLess, но я получаю.

Можно ли выполнить синтаксический анализ XML в функции AWS Node.js Lambda без использования стороннего модуля, такого как xml2js? Мне интересно, есть ли у AWS какая-либо встроенная функциональность.

Я м, используя mongodb родной диск, чтобы получить указатель на результат запроса. Я использую поле ‘comment’, которое в основном представляет собой строку ниже приведен фрагмент кода, который я.

я получил эту ошибку adb: не удалось установить C:UsersUserDocumentsBukuTamubukutamubuildappoutputsapkapp.apk: сбой [INSTALL_FAILED_OLDER_SDK: неудачный синтаксический анализ во время.

Я создал новый проект react native с помощью команды expo init projectname. и запустите это командой expo start в project library.this project run perfect на реальном устройстве, но эта ошибка.

Я пытаюсь преобразовать строку в формат timestamp в BigQuery. Источник имеет все даты в формате 10/15 11:59 PM. Вот что я пытаюсь сделать в качестве доказательства концепции: SELECT PARSE_TIMESTAMP(.

Xml.bad

Наконец-то появилось свободное время между бесконечной чередой заказов, и я решил заняться своим блогом. Попробуем его улучшить в плане валидации. Ниже в статье я расскажу, что такое валидация сайта, кода html и css, зачем она нужна и как привести сайт к стандартам на конкретном примере.

Читайте так же:
Как самому подключить домофонную трубку

Что такое валидация сайта?

Простыми словами – это проверка на соответствие стандартам. Чтобы любой браузер мог отображать ваш сайт корректно. Большое влияние валидность сайта на продвижение не оказывает, но хуже точно не будет.

Конкретный пример прохождения валидации для страницы сайта

Возьмем первую попавшуюся страницу на моем сайте — Кодирование и декодирование base64 на Java 8. Забьем адрес страницы в валидатор и смотрим результат:

ошибки валиадции

Да уж, картина вырисовывается неприятная: больше сотни ошибок и 67 предупреждений – как вообще поисковики индексируют мой блог, и заходят люди? Но не будем огорчаться, а научимся проходить валидацию, справлять ошибки. Итак, первое предупреждение:

Это одно и тоже. А исправляется просто: в самом начале страницы добавить тег:

Проверяем ,что у нас получилось и видим, что одним этим тегом мы убрали 105 ошибок и 3 предупреждения! Теперь у нас осталось только 64 предупреждения. Начинаем разбирать их по одному.

Это значит, что для элемента style не нужен атрибут type – это лишнее. На странице у нас два таких замечания. Аналогичное предупреждение и по JavaScript:

Таких у нас 8 ошибок. Убираем данные атрибуты и ура – еще на 10 предупреждений меньше!

Следующая ошибка — первый аргумент у linear-gradient должен быть to top, а не top. Исправлем. Далее ошибка:

Здесь у меня неверно закомментировано css. Надо просто убрать эту строку. Или закомментировать по-другому /* и */. Я так сделал, как привык так комментировать на Java.

Теперь у нас идет ошибка импорта. Перенесем эти строчки в самое начало файла и она исчезнет.

Далее не нравится значение атрибута target, нам сообщают, что надо использовать «blank» без нижнего подчеркивания спереди. Убираем.

Теперь у нас идет div не на месте.

Следующая ошибка – лишний colspan у ячейки. В моем случае таблица состоит всего из одной ячейки, видимо, забыл убрать, когда менял дизайн. Теперь это и делаем.

А эта ошибка говорит о том, что нельзя вставлять style внутри div. Переносим в начало файла.

Тут нам подсказывают, что не стоит устанавливать ширину атрибутом, а лучше сделать это отдельным тегом. Меняем на style=»width:100%;».

У ячейки не должно быть имени – атрибута name. Тут в принципе можно убрать, id вполне хватит.

Убираем valign. Вместо него ставим style=»vertical-align:top».

А эта ошибка вообще непонятно как оказалась ) Это я коде к статье ошибся. Меняем на <

У изображений должен быть alt. Добавляем альты с описанием картинок.

Только ноль может быть без обозначений. Надо поставить что – это пиксели, или к примеру, проценты. Добавляем px после чисел.

Не нравятся комментарии. Да, в общем, их можно и убрать, не разбираясь, не особенно они и нужны.

Заблудившийся тег td. Убираем его.

Здесь валидатор не устраивает пустое значение атрибута action – должен быть адрес страницы какой-то. У нас обрабатывается данная форма js, так что без разницы, поставим action=”self”

Все! Смотрим результат:

валиадция сайта пройдена

Нет ошибок или предупреждений, страница полностью валидна.

Если вам что-то непонятно в статье или вы хотите, чтобы ваш сайт полностью соответствовал спецификации и стандартам HTML ,вы можете обратиться ко мне. Я проверю и устраню любые шибки валидации.


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, сайтостроение, html, валидация

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector