Как 'выбрать' из XML с пространствами имен?

Для начала не используйте std::cin для тестирования. Просто установите значение в вашем коде для согласованности и простоты разработки. Используйте эту страницу для справки.

#include 
#include 

int main() {
    std::string str("this and_that are the tests");
    auto start = str.find_first_of(" ,\n", 0);
    auto end = str.find_first_of(" ,\n", start + 1);
    std::cout << str.substr(start, end - start);
    return 0;
}

И это все еще что-то вроде хака, это просто зависит от того, куда ты идешь. Например, библиотека Boost богата расширенными манипуляциями со строками. Если вы собираетесь разобрать более одного слова, это все равно можно сделать с помощью манипуляций со строками, но специальные парсеры могут выйти из-под контроля. Есть и другие инструменты, такие как Boost Spirit , чтобы держать код под контролем.

13
задан Mathias Müller 31 March 2014 в 12:35
поделиться

3 ответа

Объявите префикс пространства имен для пространства имен в Вашем XSLT и затем select использование того префикса:

<xsl:stylesheet ... xmlns:os="urn:schemas-microsoft-com:office:spreadsheet">
  ...   
  <xsl:for-each select="//os:Row">
    ...
  </xsl:for-each>
  ...
</xsl:stylesheet>

Это обычно приводит к XPaths, которые легко считать. Однако инструменты XSLT/XPath генерируют следующий, эквивалентный код:

<xsl:for-each select="//*[local-name()='Row' = and namespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']">
   ...
</xsl:for-each>
32
ответ дан 1 December 2019 в 17:42
поделиться

Если Вы не заботитесь о пространстве имен, можно использовать XPath 'локальное имя ()' функция:

<xsl:for-each select="//*[local-name() = 'Row']">
  <xsl:copy-of select="."/>
</xsl:for-each>

Кроме того, то же то же самое может быть выражено как это. Я не уверен, является ли это стандартный XPath и если все реализации XPath поддерживают его (ColdFusion делает, таким образом, вероятно, Java делает также). Возможно, кто-то знает, соответствует ли это какому-либо стандарту.

<xsl:for-each select="//:Row">
  <xsl:copy-of select="."/>
</xsl:for-each>
10
ответ дан 1 December 2019 в 17:42
поделиться

Tomalek и ckarras дают хорошие ответы, но я хочу разъяснить причины позади них.

Элементы, которым Вы не соответствуете, находятся в пространстве имен по умолчанию объема, в котором они происходят в документе, то есть, они находятся в пространстве имен, объявленном для того объема без префикса (например.

xmlns="urn:schemas-microsoft-com:office:spreadsheet"

на Workbook элемент). Даже при том, что tagnames испытывают недостаток в префиксе пространства имен, они находятся в пространстве имен.

Однако XPath требует, чтобы все названия элементов в пространстве имен были квалифицированы с префиксом, или что пространство имен быть указанными явно с namespace-uri() в предикате. Следовательно, необходимо или использовать local-name() функция в предикате, чтобы соответствовать имени элемента (и использовать namespace-uri() функционируйте также, если существует опасность коллизий имени через пространства имен), или необходимо объявить каждое пространство имен, в котором Вы хотите соответствовать элементам в XPaths с префиксом и квалифицировать имена элементов с их префиксами пространства имен в выражениях XPath.

7
ответ дан 1 December 2019 в 17:42
поделиться
Другие вопросы по тегам:

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