Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 2 additions & 10 deletions backend/apps/data_training/curd/data_training.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import datetime
import logging
import traceback
from typing import List, Optional
from xml.dom.minidom import parseString

import dicttoxml
from sqlalchemy import and_, select, func, delete, update, or_
from sqlalchemy import text

Expand All @@ -15,6 +13,7 @@
from apps.template.generate_chart.generator import get_base_data_training_template
from common.core.config import settings
from common.core.deps import SessionDep, Trans
from common.utils.dict_to_xml import dict_to_xml
from common.utils.embedding_threads import run_save_data_training_embeddings


Expand Down Expand Up @@ -594,14 +593,7 @@ def select_training_by_question(session: SessionDep, question: str, oid: int, da

def to_xml_string(_dict: list[dict] | dict, root: str = 'sql-examples') -> str:
item_name_func = lambda x: 'sql-example' if x == 'sql-examples' else 'item'
dicttoxml.LOG.setLevel(logging.ERROR)
xml = dicttoxml.dicttoxml(_dict,
cdata=['question', 'suggestion-answer'],
custom_root=root,
item_func=item_name_func,
xml_declaration=False,
encoding='utf-8',
attr_type=False).decode('utf-8')
xml = dict_to_xml(_dict, root_name=root, item_func=item_name_func)
pretty_xml = parseString(xml).toprettyxml()

if pretty_xml.startswith('<?xml'):
Expand Down
12 changes: 2 additions & 10 deletions backend/apps/terminology/curd/terminology.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import datetime
import logging
import traceback
from typing import List, Optional, Any
from xml.dom.minidom import parseString

import dicttoxml
from sqlalchemy import and_, or_, select, func, delete, update, union, text, BigInteger
from sqlalchemy.orm import aliased

Expand All @@ -15,6 +13,7 @@
from apps.terminology.models.terminology_model import Terminology, TerminologyInfo, TerminologyInfoResult
from common.core.config import settings
from common.core.deps import SessionDep, Trans
from common.utils.dict_to_xml import dict_to_xml
from common.utils.embedding_threads import run_save_terminology_embeddings


Expand Down Expand Up @@ -949,14 +948,7 @@ def get_example():

def to_xml_string(_dict: list[dict] | dict, root: str = 'terminologies') -> str:
item_name_func = lambda x: 'terminology' if x == 'terminologies' else 'word' if x == 'words' else 'item'
dicttoxml.LOG.setLevel(logging.ERROR)
xml = dicttoxml.dicttoxml(_dict,
cdata=['word', 'description'],
custom_root=root,
item_func=item_name_func,
xml_declaration=False,
encoding='utf-8',
attr_type=False).decode('utf-8')
xml = dict_to_xml(_dict, root_name=root, item_func=item_name_func)
pretty_xml = parseString(xml).toprettyxml()

if pretty_xml.startswith('<?xml'):
Expand Down
49 changes: 49 additions & 0 deletions backend/common/utils/dict_to_xml.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
"""
将 dict/list 转换为 XML 字符串的工具函数,用于替代 dicttoxml 库(GPL 许可证风险)。
仅依赖 Python 标准库。
"""

import xml.etree.ElementTree as ET


def _add_element(parent: ET.Element, key: str, value, item_func=None):
"""递归地将值添加为 XML 子元素。"""
elem = ET.SubElement(parent, key)

if isinstance(value, dict):
for k, v in value.items():
_add_element(elem, k, v, item_func)
elif isinstance(value, list):
item_name = item_func(key) if item_func else 'item'
for item in value:
_add_element(elem, item_name, item, item_func)
elif isinstance(value, bool):
elem.text = str(value).lower()
elif value is None:
elem.text = ''
else:
elem.text = str(value)


def dict_to_xml(data: dict | list, root_name: str = 'root', item_func=None) -> str:
"""
将 dict 或 list 转换为 XML 字符串。

:param data: 要转换的 dict 或 list
:param root_name: XML 根元素名称
:param item_func: 列表项元素名的函数,接收父元素名,返回子元素名
:return: XML 字符串
"""
root = ET.Element(root_name)

if isinstance(data, dict):
for key, value in data.items():
_add_element(root, key, value, item_func)
elif isinstance(data, list):
item_name = item_func(root_name) if item_func else 'item'
for item in data:
_add_element(root, item_name, item, item_func)
else:
root.text = str(data)

return ET.tostring(root, encoding='unicode', xml_declaration=False)
1 change: 0 additions & 1 deletion backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ dependencies = [
"python-calamine>=0.4.0",
"xlrd>=2.0.2",
"clickhouse-sqlalchemy>=0.3.2",
"dicttoxml>=1.7.16",
"dmpython==2.5.22; platform_system != 'Darwin'",
"redshift-connector>=2.1.8",
"elasticsearch[requests] (>=7.10,<8.0)",
Expand Down
Loading