Используя схему для переупорядочения элементов XML-документа в соответствии со схемой

Найденный под "app/code/core/Mage/Page/Block/Html/Header.php":

public function getWelcome()
{
    if (empty($this->_data['welcome'])) {
        if (Mage::app()->isInstalled() && Mage::getSingleton('customer/session')->isLoggedIn()) {
            $this->_data['welcome'] = $this->__('Welcome, %s!', Mage::getSingleton('customer/session')->getCustomer()->getName());
        } else {
            $this->_data['welcome'] = Mage::getStoreConfig('design/header/welcome');
        }
    }

    return $this->_data['welcome'];
}

, Таким образом, это похоже Mage::getSingleton('customer/session')->getCustomer(), доберется, Ваш ток вошел в систему клиент;)

Для получения в настоящее время входил в систему администратор:

Mage::getSingleton('admin/session')->getUser();
5
задан Marcin 31 January 2012 в 14:51
поделиться

3 ответа

Ваша проблема выражается в следующем: у вас есть файл XSM, который не соответствует схеме, и вы хотите преобразовать его во что-то действительное.

С помощью XSOM вы можете прочитать структуру в XSD и, возможно, проанализировать XML, но все равно потребуется дополнительное отображение недопустимой формы на допустимую. Использовать таблицу стилей было бы намного проще, потому что вам пришлось бы проходить через XML, используя узлы XPath для обработки элементов в правильном порядке. В XML, где вы хотите, чтобы яблоки были перед грушами, таблица стилей сначала скопирует узел яблока (/ Fruit / Apple), а затем узел груши. Таким образом, независимо от порядка в старом файле, они будут в правильном порядке в новом файле.

Что вы могли сделать с XSOM, так это прочитать XSD и сгенерировать таблицу стилей, которая изменит порядок данных. Затем преобразуйте XML, используя эту таблицу стилей. как только XSOM сгенерировал таблицу стилей для XSD, вы можете просто повторно использовать таблицу стилей до тех пор, пока XSD не будет изменен или пока не потребуется другой XSD.

Конечно, вы можете использовать XSOM для немедленного копирования узлов в правильном порядке. Но поскольку это означает, что ваш код должен пройти через все узлы и дочерние узлы, для завершения обработки может потребоваться некоторое время. Таблица стилей будет делать то же самое, но преобразователь сможет все это обработать быстрее. Он может работать непосредственно с данными, в то время как код Java должен будет получать / устанавливать каждый узел через свойства XMLDocument.


Итак, я бы использовал XSOM для создания таблицы стилей для XSD, которая просто копировала бы узел XML за узлом в использовать снова и снова. Таблицу стилей нужно будет переписать только при изменении XSD, и она будет работать быстрее, чем когда Java API сам должен проходить через узлы. Таблица стилей не заботится о порядке, поэтому она всегда будет в правильном порядке.
Чтобы сделать ее более интересной, вы можете просто пропустить XSOM и попытаться работать с таблицей стилей, которая читает XSD, чтобы сгенерировать из нее другую таблицу стилей. . Эта сгенерированная таблица стилей будет копировать узлы XML в точном порядке, как определено в таблице стилей. Было бы сложно? Фактически, таблица стилей должна будет генерировать шаблоны для каждого элемента и следить за тем, чтобы дочерние элементы в этом элементе обрабатывались в правильном порядке. Таблица стилей не заботится о порядке, поэтому она всегда будет в правильном порядке.
Чтобы сделать ее более интересной, вы можете просто пропустить XSOM и попытаться поработать со таблицей стилей, которая читает XSD, чтобы сгенерировать из нее другую таблицу стилей. . Эта сгенерированная таблица стилей будет копировать узлы XML в точном порядке, как определено в таблице стилей. Было бы сложно? Фактически, таблица стилей должна будет генерировать шаблоны для каждого элемента и следить за тем, чтобы дочерние элементы в этом элементе обрабатывались в правильном порядке. Таблица стилей не заботится о порядке, поэтому она всегда будет в правильном порядке.
Чтобы сделать ее более интересной, вы можете просто пропустить XSOM и попытаться поработать со таблицей стилей, которая читает XSD, чтобы сгенерировать из нее другую таблицу стилей. . Эта сгенерированная таблица стилей будет копировать узлы XML в точном порядке, как определено в таблице стилей. Было бы сложно? Фактически, таблица стилей должна будет генерировать шаблоны для каждого элемента и следить за тем, чтобы дочерние элементы в этом элементе обрабатывались в правильном порядке. Эта сгенерированная таблица стилей будет копировать узлы XML в точном порядке, как определено в таблице стилей. Было бы сложно? Фактически, таблица стилей должна будет генерировать шаблоны для каждого элемента и следить за тем, чтобы дочерние элементы в этом элементе обрабатывались в правильном порядке. Эта сгенерированная таблица стилей будет копировать узлы XML в точном порядке, как определено в таблице стилей. Было бы сложно? Фактически, таблица стилей должна будет генерировать шаблоны для каждого элемента и следить за тем, чтобы дочерние элементы в этом элементе обрабатывались в правильном порядке.

Когда я думаю об этом, мне интересно, было ли это уже сделано раньше. Он был бы очень общим и мог бы обрабатывать почти каждый XSD / XML.

Давайте посмотрим ... Используя "// xsd: element / @ name", вы получите все имена элементов в схеме. Каждое уникальное имя необходимо преобразовать в шаблон. В этих шаблонах вам нужно будет обработать дочерние узлы конкретного элемента, что немного сложнее получить. Элементы могут иметь ссылку, которой вам нужно будет следовать. В противном случае получить все дочерние узлы xsd: element it.

2
ответ дан 14 December 2019 в 01:12
поделиться

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

<xs:element name="root">
  <xs:choice>
    <xs:sequence>
      <xs:element name="foo"/>
      <xs:element name="bar">
        <xs:element name="dee">
        <xs:element name="dum">
      </xs:element>
    </xs:sequence>
    <xs:sequence>
      <xs:element name="bar">
        <xs:element name="dum">
        <xs:element name="dee">
      </xs:element>
      <xs:element name="foo"/>
    </xs:sequence>
  </xs:choice>
</xs:element>

и этот входной XML:

<root>
  <foo/>
  <bar>
    <dum/>
    <dee/>
  </bar>
</root>

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

3
ответ дан 14 December 2019 в 01:12
поделиться

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

Я дам вам решение C # -синтаксиса, поскольку это то, что я кодирую днем ​​и ночью, оно довольно близко к Java. Обратите внимание, что мне придется догадываться о XSOM, поскольку я не знаю его API. Я также придумал методы XML Dom, поскольку предоставление ваших C #, вероятно, не поможет :)

// предполагаем, что первым вызовом является SortChildrenIntoNewDocument (sourceDom.DocumentElement, targetDom.DocumentElement, schema.RootElement)

public void SortChildrenIntoNewDocument( XmlElement source, XmlElement target, SchemaElement schemaElement )
{
    // whatever method you use to ask the XSOM to tell you the correct contents
    SchemaElement[] orderedChildren = schemaElement.GetChildren();
    for( int i = 0; i < orderedChildren.Length; i++ )
    {
        XmlElement sourceChild = source.SelectChildByName( orderedChildren[ i ].Name );
        XmlElement targetChild = target.AddChild( sourceChild )
        // recursive-call
        SortChildrenIntoNewDocument( sourceChild, targetChild, orderedChildren[ i ] );
    }
}

Я бы не стал Не рекомендую рекурсивный метод, если это будет глубокое дерево, в этом случае вам придется создать некоторые объекты типа «обходчик дерева». Преимущество такого подхода в том, что вы »

1
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

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