#python #json #xml #xmltodict
#питон #json #xml #xmltodict
Вопрос:
Мне нужно преобразовать один файл XML в JSON с помощью python, но мне нужно поместить атрибуты отца после дочерних узлов в JSON
Мой текущий код похож на этот.
def generate_json(self, event=None):
# opening the xml file
with open(self.fn ,"r") as xmlfileObj:
data_dict = lib.xmltodict.parse(xmlfileObj.read(),attr_prefix='_')
xmlfileObj.close()
jsonObj= json.dumps(data_dict, sort_keys=False)
restored = json.loads(jsonObj)
#storing json data to json file
with open("data.json", "w") as jsonfileObj:
jsonfileObj.write(jsonObj)
jsonfileObj.close()
и мне это нужно;
{
"datasetVersion": {
"metadataBlocks": {
"citation": {
"fields": [
{
"value": "Darwin's Finches",
"typeClass": "primitive",
"multiple": false,
"typeName": "title"
}
],
"displayName": "Citation Metadata"
}
}
}
}
на месте:
{
"datasetVersion": {
"metadataBlocks": {
"citation": {
"displayName": "Citation Metadata",
"fields": [
{
"value": "Darwin's Finches",
"typeClass": "primitive",
"multiple": false,
"typeName": "title"
}
]
}
}
}
}
Нет в алфавитном порядке, изменяя sort_keys=False, мне нужно только изменить атрибуты node father на final.
на каком-то сайте сделайте так, как мне нужно: https://www.convertjson.com/xml-to-json.htm
и еще одно нет как:
http://www.utilities-online.info/xmltojson/#.X_crINhKiUk
кто-нибудь может мне помочь?
Комментарии:
1. Действительно ли порядок имеет значение? Этого не должно быть для большинства приложений.
2. Да, потому что по этой схеме работает подсистема на более низком уровне, разработанная ранее :/
3. Объекты AFAIK json неупорядочены по стандарту, поэтому, если вы не используете пользовательский анализатор json или какую-либо проверку в подсистеме, это в любом случае не должно иметь значения.
Ответ №1:
Я мог бы отформатировать, используя https://pypi.org/project/xmljson / библиотека, я изменил стиль барсука
класс BadgerFish(XMLData): # соглашение было изменено из проекта на префикс _ и упорядочивает атрибуты родительских узлов «‘Преобразует между XML и данными, используя соглашение BadgerFish»‘ def init(self, ** kwargs): super(BadgerFish, self).инициализация (attr_prefix=’_’, text_content=’$’, **kwargs)
Я изменил префикс атрибута на «_»
в противном случае только изменил **# modify, чтобы завершить атрибуты отца, как мы можем видеть в коде
def data(self, root):
'''Convert etree.Element into a dictionary'''
value = self.dict()
children = [node for node in root if isinstance(node.tag, basestring)]
if root.text and self.text_content is not None:
text = root.text
if text.strip():
if self.simple_text and len(children) == len(root.attrib) == 0:
value = self._fromstring(text)
else:
value[self.text_content] = self._fromstring(text)
count = Counter(child.tag for child in children)
for child in children:
# if child.tag == "System_State_Entry": print(child.tag)
if count[child.tag] == 1:
value.update(self.data(child))
else:
result = value.setdefault(child.tag, self.list())
result = self.data(child).values()
# if simple_text, elements with no children nor attrs become '', not {}
if isinstance(value, dict) and not value and self.simple_text:
value = ''
**# modify to put the father atributes to finish
for attr, attrval in root.attrib.items():
attr = attr if self.attr_prefix is None else self.attr_prefix attr
value[attr] = self._fromstring(attrval)**
return self.dict([(root.tag, value)])