|
|
|
@ -61,6 +61,7 @@ class TemplateParserController extends BaseContentController {
@@ -61,6 +61,7 @@ class TemplateParserController extends BaseContentController {
|
|
|
|
|
traverse(child); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (var node in _treeNodes) { |
|
|
|
|
traverse(node); |
|
|
|
|
} |
|
|
|
@ -92,50 +93,56 @@ class TemplateParserController extends BaseContentController {
@@ -92,50 +93,56 @@ class TemplateParserController extends BaseContentController {
|
|
|
|
|
Logger().debug('开始解析XML,根元素: ${document.rootElement.name}'); |
|
|
|
|
_treeNodes = _buildTreeNodes(document.rootElement, document.rootElement.localName, depth: 0); |
|
|
|
|
|
|
|
|
|
// 新增:解析所有节点值到 templateItems |
|
|
|
|
_templateItems = _parseAllNodeValues(document); |
|
|
|
|
// 新增:解析所有节点值到 templateItems |
|
|
|
|
_templateItems = _parseAllNodeValues(document); |
|
|
|
|
|
|
|
|
|
notifyListeners(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<TemplateItem> _parseAllNodeValues(xml.XmlDocument document) { |
|
|
|
|
final items = <TemplateItem>[]; |
|
|
|
|
int id = 0; |
|
|
|
|
|
|
|
|
|
// 递归遍历所有元素 |
|
|
|
|
void traverse(xml.XmlElement element, String currentPath) { |
|
|
|
|
// 1. 添加当前元素的所有属性值 |
|
|
|
|
for (final attr in element.attributes) { |
|
|
|
|
items.add(TemplateItem( |
|
|
|
|
id: id++, |
|
|
|
|
content: attr.value, |
|
|
|
|
xPath: '$currentPath/@${attr.name.local}', |
|
|
|
|
value: attr.value, |
|
|
|
|
nodeType: NodeType.attribute, |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 2. 添加当前元素的文本内容(如果有) |
|
|
|
|
final textNodes = element.children.whereType<xml.XmlText>().where((t) => t.text.trim().isNotEmpty); |
|
|
|
|
if (textNodes.isNotEmpty) { |
|
|
|
|
items.add(TemplateItem( |
|
|
|
|
id: id++, |
|
|
|
|
content: textNodes.first.text, |
|
|
|
|
xPath: currentPath, |
|
|
|
|
value: textNodes.first.text, |
|
|
|
|
nodeType: NodeType.text, |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 3. 递归处理子元素 |
|
|
|
|
for (final child in element.childElements) { |
|
|
|
|
traverse(child, '$currentPath/${child.name.local}'); |
|
|
|
|
final items = <TemplateItem>[]; |
|
|
|
|
int id = 0; |
|
|
|
|
|
|
|
|
|
// 递归遍历所有元素 |
|
|
|
|
void traverse(xml.XmlElement element, String currentPath) { |
|
|
|
|
// 1. 添加当前元素的所有属性值 |
|
|
|
|
for (final attr in element.attributes) { |
|
|
|
|
items.add( |
|
|
|
|
TemplateItem( |
|
|
|
|
id: id++, |
|
|
|
|
content: attr.value, |
|
|
|
|
xPath: '$currentPath/@${attr.name.local}', |
|
|
|
|
value: attr.value, |
|
|
|
|
nodeType: NodeType.attribute, |
|
|
|
|
), |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 2. 添加当前元素的文本内容(如果有) |
|
|
|
|
final textNodes = element.children.whereType<xml.XmlText>().where( |
|
|
|
|
(t) => t.text.trim().isNotEmpty, |
|
|
|
|
); |
|
|
|
|
if (textNodes.isNotEmpty) { |
|
|
|
|
items.add( |
|
|
|
|
TemplateItem( |
|
|
|
|
id: id++, |
|
|
|
|
content: textNodes.first.text, |
|
|
|
|
xPath: currentPath, |
|
|
|
|
value: textNodes.first.text, |
|
|
|
|
nodeType: NodeType.text, |
|
|
|
|
), |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 3. 递归处理子元素 |
|
|
|
|
for (final child in element.childElements) { |
|
|
|
|
traverse(child, '$currentPath/${child.name.local}'); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
traverse(document.rootElement, document.rootElement.localName); |
|
|
|
|
return items; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
traverse(document.rootElement, document.rootElement.localName); |
|
|
|
|
return items; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<TemplateNode> _buildTreeNodes( |
|
|
|
|
xml.XmlElement element, |
|
|
|
@ -145,7 +152,7 @@ class TemplateParserController extends BaseContentController {
@@ -145,7 +152,7 @@ class TemplateParserController extends BaseContentController {
|
|
|
|
|
}) { |
|
|
|
|
final node = TemplateNode( |
|
|
|
|
path: path, |
|
|
|
|
name: element.name.local, |
|
|
|
|
name: element.qualifiedName, |
|
|
|
|
children: [], |
|
|
|
|
depth: depth, |
|
|
|
|
isExpanded: depth < 5, // 默认展开前两层 |
|
|
|
@ -159,7 +166,7 @@ class TemplateParserController extends BaseContentController {
@@ -159,7 +166,7 @@ class TemplateParserController extends BaseContentController {
|
|
|
|
|
element.attributes.map( |
|
|
|
|
(attr) => TemplateNode( |
|
|
|
|
path: '$path/@${attr.name.local}', |
|
|
|
|
name: '@${attr.name.local}', |
|
|
|
|
name: '@${attr.qualifiedName}', |
|
|
|
|
children: [], |
|
|
|
|
depth: depth + 1, |
|
|
|
|
isAttribute: true, |
|
|
|
@ -218,7 +225,7 @@ class TemplateParserController extends BaseContentController {
@@ -218,7 +225,7 @@ class TemplateParserController extends BaseContentController {
|
|
|
|
|
void traverse(TemplateNode node) { |
|
|
|
|
if (node.isChecked) { |
|
|
|
|
selectedNodes.add(node); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (var child in node.children) { |
|
|
|
|
traverse(child); |
|
|
|
|
} |
|
|
|
@ -230,4 +237,4 @@ class TemplateParserController extends BaseContentController {
@@ -230,4 +237,4 @@ class TemplateParserController extends BaseContentController {
|
|
|
|
|
|
|
|
|
|
return selectedNodes; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|