2013-12-10 3 views
2

У кого-нибудь есть способ конвертировать данные из формата Atom (XML) в JSON? Я бы предпочел бесплатный онлайн-инструмент для этого. Я не могу опубликовать данные, которые я пытаюсь преобразовать в Интернете: поскольку он содержит конфиденциальную информацию.Преобразование Atom (XML) в JSON

+0

Какой формат вы на самом деле хотите? Просто говоря, «JSON» оставляет вещи немного расплывчатыми, так как внутренняя структура может быть абсолютно любой. – cloudfeet

+0

@cloudfeet Я хочу, чтобы JSON отформатировал после имен и структуры полей, которые представлены в XML. Просто прям от Atom (XML) до JSON. –

ответ

5

«Преобразование XML в JSON» прост, но XML и JSON - это разные структурные парадигмы. Если ваш XML-документ выглядит следующим образом:

<a> 
    <b>foo</b> 
    <c prop="value">bar</c> 
</a> 

... как вы представляете это в JSON? Есть много вопросов, таких как:

  • Имеет ли порядок? (Свойства объекта в JSON неупорядоченны, поэтому после преобразования не существует никакого способа узнать, если <c> было до или после <b>)
  • Если есть только один <b>, это означает, что это массив одного элемента или просто объект?
  • Как вы представляете атрибуты? Преобразует ли конвертер между строками (для "b") и объектами с дополнительными свойствами (для "c") в зависимости от того, определены ли атрибуты?

Каждый «конвертер XML-JSON», который я видел, несколько изменил подход к этому, поэтому нет «стандартного» поведения, на которое можно положиться.

Итак, для получения полного ответа, я думаю, вам нужно дать более четкое представление о том, как вы хотите, чтобы ваш формат JSON ATOM выглядел.


Если вы просто хотите что-то , и вы будете работать вокруг того, что вы получите, то вы могли бы быть в состоянии сделать это с помощью службы, как Yahoo Pipes (например here, я уверен, что есть больше).

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

+0

Чтобы уменьшить двусмысленность, такой переводчик должен проверить схему XML/DTD. –

1

Мы нашли XSLT здесь:

http://www.bjelic.net/2012/08/01/coding/convert-xml-to-json-using-xslt/#code

и слегка модифицировал его, чтобы обработать ссылки & категории элементов Atom документа с тем, как мы хотим показать его.

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" encoding="utf-8"/> 

    <xsl:template match="/*[node()]"> 
     <xsl:text>{</xsl:text> 
     <xsl:apply-templates select="." mode="detect" /> 
     <xsl:text>}</xsl:text> 
    </xsl:template> 

    <xsl:template match="*" mode="detect"> 
     <xsl:choose> 
      <xsl:when test="name(preceding-sibling::*[1]) = name(current()) and name(following-sibling::*[1]) != name(current())"> 
        <xsl:apply-templates select="." mode="obj-content" /> 
       <xsl:text>]</xsl:text> 
       <xsl:if test="count(following-sibling::*[name() != name(current())]) &gt; 0">, </xsl:if> 
      </xsl:when> 
      <xsl:when test="name(preceding-sibling::*[1]) = name(current())"> 
        <xsl:apply-templates select="." mode="obj-content" /> 
        <xsl:if test="name(following-sibling::*) = name(current())">, </xsl:if> 
      </xsl:when> 
      <xsl:when test="following-sibling::*[1][name() = name(current())]"> 
       <xsl:text>"</xsl:text><xsl:value-of select="name()"/><xsl:text>" : [</xsl:text> 
        <xsl:apply-templates select="." mode="obj-content" /><xsl:text>, </xsl:text> 
      </xsl:when> 
      <xsl:when test="count(./child::*) > 0 or count(@*) > 0"> 
       <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : <xsl:apply-templates select="." mode="obj-content" /> 
       <xsl:if test="count(following-sibling::*) &gt; 0">, </xsl:if> 
      </xsl:when> 
      <xsl:when test="count(./child::*) = 0"> 
       <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : "<xsl:apply-templates select="."/><xsl:text>"</xsl:text> 
       <xsl:if test="count(following-sibling::*) &gt; 0">, </xsl:if> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="*" mode="obj-content"> 
     <xsl:text>{</xsl:text> 
      <xsl:apply-templates select="@*" mode="attr" /> 
      <xsl:if test="count(@*) &gt; 0 and (count(child::*) &gt; 0 or text())">, </xsl:if> 
      <xsl:apply-templates select="./*" mode="detect" /> 
      <xsl:if test="count(child::*) = 0 and text() and not(@*)"> 
       <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : "<xsl:value-of select="text()"/><xsl:text>"</xsl:text> 
      </xsl:if> 
      <xsl:if test="count(child::*) = 0 and text() and @*"> 
       <xsl:text>"text" : "</xsl:text><xsl:value-of select="text()"/><xsl:text>"</xsl:text> 
      </xsl:if> 
     <xsl:text>}</xsl:text> 
     <xsl:if test="position() &lt; last()">, </xsl:if> 
    </xsl:template> 

    <xsl:template match="@*" mode="attr"> 
     <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : "<xsl:value-of select="."/><xsl:text>"</xsl:text> 
     <xsl:if test="position() &lt; last()">,</xsl:if> 
    </xsl:template> 

    <xsl:template match="node/@TEXT | text()" name="removeBreaks"> 
     <xsl:param name="pText" select="normalize-space(.)"/> 
     <xsl:choose> 
      <xsl:when test="not(contains($pText, '&#xA;'))"><xsl:copy-of select="$pText"/></xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="concat(substring-before($pText, '&#xD;&#xA;'), ' ')"/> 
       <xsl:call-template name="removeBreaks"> 
        <xsl:with-param name="pText" select="substring-after($pText, '&#xD;&#xA;')"/> 
       </xsl:call-template> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

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

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа [здесь] (http://meta.stackoverflow.com/a/8259) и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – bummi

+0

Приветствия за то, что вы указали URL-адрес в моем блоге;) –

+0

@BojanBjelic, ваш прием! :-) Этот XSLT нам очень полезен. –

Смежные вопросы