2016-11-27 2 views
1

Я пытаюсь получить массив атрибутов, и я разбиваю на символ пробела. То, что я прекрасно работаю, за исключением случаев, когда задействованы пространства имен. Вот мой пример кода:Как получить массив атрибутов, когда между именем и значением есть пробельные символы?

XML:

<?xml version="1.0" encoding="utf-8"?> 
<s:node something xmlns:s = "library://ns.adobe.com/flex/spark" 
xmlns:b='testnamespace.com' xmlns="noprefix.com"></node> 

Exmascript:

var xmlString:String = 'something xmlns:s = "library://ns.adobe.com/flex/spark" xmlns:b='testnamespace.com' xmlns="noprefix.com"'; 
var attributes:Array = xmlString.split(/\s+/g); 

Это приводит этот массив элементов:

- something 
- xmlns:s 
- = 
- "library://ns.adobe.com/flex/spark" 
- xmlns:b='testnamespace.com' 
- xmlns="noprefix.com" 

Как бы я разделил атрибуты вверх когда между именем и значением есть пробелы?

PS:
У меня есть синтаксический анализатор XML, но он выдает ошибку из-за несоответствующих пространств имен. Поэтому мне приходится разбирать атрибуты и удалять или исправлять недопустимые пространства имен, а затем я могу передать им строку XML.

PSS:
Мне нужно только работать с первым тегом, чтобы добавить пространства имен. Я не делаю никаких других строковых манипуляций.

+0

Используйте XML-парсер вместо этого. Регулярные выражения JavaScript недостаточно эффективны для правильного анализа XML. – Ryan

+0

У меня есть синтаксический анализатор XML, но он вызывает ошибку из-за несоответствующих пространств имен. Поэтому я должен разбирать атрибуты и удалять или исправлять недопустимые пространства имен. PS Мне нужно только работать с первым тегом, чтобы добавить пространства имен. Я не делаю никаких других строковых манипуляций. –

+3

Я думаю, что вместо использования регулярного выражения вам лучше использовать замену '.replace ('=', '='). Replace ('=', '=')' перед разбиением –

ответ

1

Regex для раскола, с отрицательного предпросмотра:

split(/\s+(?!=|"|')/g

Результат:

Array[4] 
0:"something" 
1:"xmlns:s = "library://ns.adobe.com/flex/spark"" 
2:"xmlns:b="testnamespace.com"" 
3:"xmlns="noprefix.com"" 
+0

Мой друг - новичок, и он хочет знать, что такое '(?! = |" | ') 'делать? –

+1

Проверяет, нет ли '=', '' ',' '' после пробелов. Если один из этих символов найден, шаблон не соответствует, и функция не будет разделяться в этом месте. Будет лучше, если мы сможем проверьте '=' перед whitespace (lookbehind) и не используйте '' 'и' '', но поскольку я знаю, что lookbehind не работает в javascript regexp. Демо-версия: https://regex101.com/r/Y4BqLg/2 –