解析 JSX 文件以提取 Import 语句的属性。

3

有一个包含以下内容的jsx文件

<import name="abcd" color="green" age="25" />
<View color={dsdssd}>
    <IBG
        color={[color.imagecolor, color.image125]}
        imageStyle={[styles.imageStyle, styles.image125]}
        source={{ uri: contents.aimeecard }} >
        <View color={styles.titleContainer}>
            <Text color={[{green: 45}, styles.mainTileText]}</Text>
            <View color={[abcde.text]} />
        </View>
</View>

我需要使用Python脚本获取第一行的详细信息: 期望输出 name="abcd" color="green" age="25"

同时,通过列表传递jsx文件的路径 例如:[abcd/file1.jsx,dcef/file2.jsx]

尝试使用Python代码通过列表获取jsx文件

for file in jsx_path:
   data = md.parse("file")
   print( file.firstChild.tagName )

数值未被获取并且出现错误。

有人能帮助我解决这个问题吗?


你正在使用哪个解析器?看起来像是md.parse("file")将字符串字面值“file”作为参数传入,而不是一个实际的文件对象。接下来的一行代码应该类似于print( data.firstChild.tagName ),因为你正在将已解析的数据存储在变量data中,而不是变量file - Tyler Stoney
@TylerStoney 即使更改后,它仍然无法工作。 - Pucchi
1个回答

2
假设jsx_path是包含所有jsx文件路径的列表,您可以迭代每个文件并使用上下文管理器来避免显式关闭文件,如下所示:
data = ""

for file in jsx_path:
    with open(file) as f:
        data += f.readline()[8:-4] + "\n"

print(data)  # name="abcd" color="green" age="25"

根据您的评论,如果您想将其输出为字典,您可以对先前的代码进行调整:

import re

data = []

for file in jsx_path:
    with open(file) as f:
        data.append(re.split('\W+|=', f.readline()[8:-4]))

data_dict = []

for d in data:
   data_dict.append({key:value for (key, value) in zip(d[::2], d[1::2])})

print(data_dict)  # {'name': 'abcd', 'color': 'green', 'age': '25'}

请注意,这是一种hack方法。我只是按顺序读取JSX文件,因为您的用例足够简单。您也可以通过扩展stlib类HTMLParser来使用专用解析器:
from html.parser import HTMLParser

class JSXImportParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        if tag == "import":
            self._import_attrs = {key:value for (key, value) in attrs}

    @property
    def import_attrs(self):
        return self._import_attrs


parser = JSXImportParser()
data = []

for file in jsx_path:
    with open(file) as f:
        parser.feed(f.read())
        data.append(parser.import_attrs)
        print(data)  # [{'name': 'abcd', 'color': 'green', 'age': '25'}]

请注意,这只提取每个文件中最后一个导入标记的详细信息,您可以通过调整_import_attrs类属性来更改此行为。
编辑:根据您的附加评论要求使用XML解析器库,可以使用ElementTree通过对文件进行采样来提取您感兴趣的内容(导入标记)来实现相同的功能。
import xml.etree.ElementTree as ET

data = []

for file in jsx_path:
    with open(file) as f:
        import_statement = ET.XML(f.readline())
        data.append(import_statement.attrib)

print(data)  # [{'name': 'abcd', 'color': 'green', 'age': '25'}]

当然,这仅适用于导入语句在第一行的情况下,如果不是这种情况,您需要先定位它,然后再调用 ET.XML

但是预期输出应该是“name”变量的值为“abcd”,同样适用于其他变量颜色和年龄。我应该能够获取变量的详细信息/值。 - Pucchi
"name="sbcd" color="green" age="27" "这是输出。我该如何将字符串转换为字典?name键应该具有值@rmpr。 - Pucchi
更新了您所要求的答案。 - RMPR
使用XML阅读器无法读取JSX文件,因为它不是有效的XML文件。您可以调整Python标准库中的HTMLParser以实现类似答案中所示的功能。如果有帮助,请不要忘记点赞并将答案标记为有效。 - RMPR
就像我说的那样,JSX在正确性方面不是一个有效的XML文件,请参考XML的语法正确性和错误处理,“单个根元素包含所有其他元素”是这里被打破的规则,这就是为什么ET会抛出异常的原因。尽管如此,如果您绝对想要使用ET或xml reader,您将需要从文件中提取import行,并对其应用XML解析器,如最后一次编辑所示。 - RMPR
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接