提取XML文件的元素和属性

时间:2013-12-15 20:55:58

标签: xml xslt

我正在寻找一种方法来自动提取xml文件中使用的每个元素和属性(甚至可能将它们放在一个表中,这会很棒)。 我目前正在使用Oxygen XML编辑器,我认为它非常强大且能够做到这一点,但我不知道实际上我将要做什么。 我知道XSLT,但我需要它很快,我现在不能开始学习它(虽然我将在下一个未来,因为它看起来很棒!)。

文件中的代码示例:

<entity_type Code="1" description="Institution"/>
<Institution_type Code="2" MechanicalCode="C" Description="brief description" />

我想要的是元素列表

entity_type
institution_type

和属性列表

Code
Description
MechanicalCode

有人能帮助我吗? :)

2 个答案:

答案 0 :(得分:1)

以下是我试图解决的问题,JAXP用于渲染(转换)结果:

XML来源:

<?xml version="1.0" encoding="UTF-8"?>
<HTML>
    <HEAD>
        <BASE href="hrEf" target="tArgEt"/>
        <SCRIPT type="typE" src="src"/>
        <STYLE type="typE" media="mEdIA"/>
    </HEAD>
    <BODY onload="OnlOAd" onunload="OnUnlOAd" background="bAckgrOUnd"/>
</HTML>

XSL模板:

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

    <xsl:output
        method="text"
        encoding="UTF-8"
        omit-xml-declaration="yes"
        indent="no"
        media-type="text/plain"
    />

    <xsl:template match="*">
        <xsl:value-of select ="local-name(.)"/>
        <xsl:for-each select="attribute::*">
            &#160;&#64;<xsl:value-of select="local-name(.)"/>&#61;&#34;<xsl:value-of select="."/>&#34;
        </xsl:for-each>
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

结果:

HTML
    HEAD
        BASE
             @href="hrEf"

             @target="tArgEt"

        SCRIPT
             @src="src"

             @type="typE"

        STYLE
             @media="mEdIA"

             @type="typE"


    BODY
             @background="bAckgrOUnd"

             @onload="OnlOAd"

             @onunload="OnUnlOAd"

注意无论树的深度如何,它是如何工作的;干杯!

答案 1 :(得分:1)

我认为您需要一个元素名称列表和源XML文档中使用的属性名称列表,每个不同的名称只列出一次。接受的答案没有提供。

以下样式表基于之前由其他人发布并随后删除的答案。与那个答案不同的是,这个问题使用密钥来删除重复项而不是测试preceding::*[name()=$name],除了速度慢之外,如果祖先具有相似的名称,它将会失败。

出于测试目的,输出是XML(将其更改为CSV或类似文件应该是微不足道的。)

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

<xsl:key name="elem" match="*" use="name()" />
<xsl:key name="attr" match="@*" use="name()" />

<xsl:template match="/">
<nodes>
    <elements>
        <xsl:apply-templates select="*" mode="elem"/>
    </elements> 
    <attributes>
        <xsl:apply-templates select="*" mode="attr"/>
    </attributes>
</nodes>    
</xsl:template>   

<xsl:template match="*" mode="elem">
    <xsl:if test="count(. | key('elem', name())[1]) = 1">
        <elem><xsl:value-of select="name()" /></elem>
    </xsl:if>
    <xsl:apply-templates select="*" mode="elem"/>
</xsl:template>

<xsl:template match="*" mode="attr">
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates select="*" mode="attr"/>
</xsl:template>

<xsl:template match="@*" >
    <xsl:if test="count(. | key('attr', name())[1]) = 1">
        <attr><xsl:value-of select="name()"/></attr>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

使用以下输入进行测试:

<?xml version="1.0" encoding="UTF-8"?>
<root radical="1">
    <alpha red="2">
        <charlie green="3">
            <echo red="4"/>
            <delta blue="4"/>
        </charlie>
        <delta blue="3">
            <alpha red="4"/>
            <root orange="6"/>
            <foxtrot green="5"/>
            <bravo orange="6"/>
        </delta>
    </alpha>
    <bravo blue="2">
        <golf white="3">
            <echo green="4">
                <hotel black="5" red="4"/>
            </echo>
        </golf>
    </bravo>
</root>

导致输出:

<?xml version="1.0" encoding="utf-8"?>
<nodes>
  <elements>
    <elem>root</elem>
    <elem>alpha</elem>
    <elem>charlie</elem>
    <elem>echo</elem>
    <elem>delta</elem>
    <elem>foxtrot</elem>
    <elem>bravo</elem>
    <elem>golf</elem>
    <elem>hotel</elem>
  </elements>
  <attributes>
    <attr>radical</attr>
    <attr>red</attr>
    <attr>green</attr>
    <attr>blue</attr>
    <attr>orange</attr>
    <attr>white</attr>
    <attr>black</attr>
  </attributes>
</nodes>