我正在寻找一种方法来自动提取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
有人能帮助我吗? :)
答案 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::*">
 @<xsl:value-of select="local-name(.)"/>="<xsl:value-of select="."/>"
</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>