我尝试过使用Pandas read_xml,它可以很好地读取大部分xml,但它忽略了一些部分,因为它的格式略有不同。我在下面包含了一个摘录,它写着";类型"激活";很好,但不适合";金额"价值它拾取列标题";金额"只是没有价值。有人能给我指一下正确的方向吗?谢谢
<Type>PYI</Type>
<Activation>N</Activation>
<Amt val="4000" curr="GBP"/>
xml_df = pd.read_xml(xml_data)
有人能帮我吗?我试过浏览Pandas.read_xml的文档,但我明白为什么它不会接受这个?
默认情况下,pandas.read_xml
解析一组节点的所有立即子节点,包括其子节点和属性。除非xpath
参数指示,否则read_xml
不会超过立即子代。
以说明您的用例。下面可能是您的XML的一般设置,其中解析<Type>
及其兄弟<Activation>
和<Amt>
。但是,<Amt>
不包含文本节点,只包含属性。因此,该列中的值应该为空。
<root>
<row>
<Type>PYI</Type> <!-- Type IS A CHILD NODE OF row -->
<Activation>N</Activation> <!-- Activation IS A CHILD NODE OF row -->
<Amt val="4000" curr="GBP"/> <!-- Amt IS A CHILD NODE OF row -->
</row>
</root>
但是您会问,为什么read_xml
忽略了val和curr属性?因为每个都不是<row>
的立即后代。他们是<Amt>
的后代(即<row>
的孙子(。如果属性被移动到<row>
,那么它们将被捕获,如下所示:
<root>
<row val="4000" curr="GBP"> <!-- val AND curr ARE CHILD ATTRIBS OF row -->
<Type>PYI</Type> <!-- Type IS A CHILD NODE OF row -->
<Activation>N</Activation> <!-- Activation IS A CHILD NODE OF row -->
<Amt/> <!-- Amt IS A CHILD NODE OF row -->
</row>
</root>
要捕获这些属性,请调整xpath
参数以指向其直接父级:
amt_df = pd.read_xml("Input.xml", xpath="//Amt")
要使用<row>
级别的信息捕获这些属性,请考虑使用特殊用途语言XSLT将原始XML转换为以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<Type>PYI</Type>
<Activation>N</Activation>
<Amt_val>4000</Amt_val>
<Amt_curr>GBP</Amt_curr>
</row>
</root>
以上是read_xml
在使用stylesheet
参数时解析的中间输出,如下所示:
xsl = '''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="row">
<xsl:copy>
<xsl:copy-of select="*[name() != 'Amt']"/>
<Amt_val><xsl:value-of select="Amt/@val"/></Amt_val>
<Amt_curr><xsl:value-of select="Amt/@curr"/></Amt_curr>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>'''
row_df = pd.read_xml("Input.xml", xpath="//row", stylesheet=xsl")