пространства имен во вложенных элементах xml - PullRequest
0 голосов
/ 30 декабря 2010

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

У меня есть xml, похожий на это:

> 
<em>
<type xmlns="http://www.sitcom-project.org/sitcom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <model>
    <implemented_with>comoco</implemented_with>
    <implemented_in>perl</implemented_in>
    <cash_flow>casual</cash_flow>
    <interaction>conventional</interaction>
  </model>
</type>
</em>

Теперь, как мне получить доступ к элементу selected_with узла?

ofc Я мог бы получить доступ к xmlList следующим образом: пространство имен ns = www.sitcom-project.org/sitcom; type.ns :: модели; но теперь, как я могу получить доступ к узлуaged_with в модели xmlList? я попытался type.ns :: model.implemented_with, но не сработало. У кого-нибудь есть идеи? спасибо

1 Ответ

1 голос
/ 30 декабря 2010

Есть несколько способов сделать это, но лучший способ - использовать префикс пространства имен перед каждым точечным доступом. В вашем случае первое, что вы хотите сделать, это изолировать пространство имен. Вы можете сделать это путем жесткого кодирования пространства имен в новый объект пространства имен ... т.е.;

var ns:Namespace = new Namespace( "http://www.sitcom-project.org/sitcom" );

Или лучший способ - просто извлечь его из соответствующего узла. В следующем коде я получаю все пространства имен (в виде массива), объявленные на узле типа, и просто нацеливаясь на первое в списке. Поскольку я заранее не знаю пространство имен, мне нужно получить его, используя метод children ().

var emNode:XML = _yourXML.em[0];
var typeRoot:XML = emNode.children()[0]; 
var ns:Namespace = typeRoot.namespaceDeclarations()[0];

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

var impWith:String = typeRoot.ns::model.ns::implemented_with;

Это может быть немного многословно, поэтому вы можете установить пространство имен по умолчанию, используя следующий синтаксис. Лично мне это не нравится, но оно работает.

default xml namespace = ns;
var impWith:String = typeRoot.model.implemented_with;
default xml namespace = null;

Может быть простой однострочник.

var ns:Namespace = new Namespace("http://www.sitcom-project.org/sitcom");
var imp:String = _yourXML.em[0].ns::type.ns::model.ns::implemented_with;

Использование синтаксиса по умолчанию

default xml namespace = new Namespace("http://www.sitcom-project.org/sitcom");
var imp:String = _yourXML.em[0].type.model.implemented_with;
default xml namespace = null;

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...