#java #json #xml #parsing
#java #json #xml #Синтаксический анализ
Вопрос:
Я пытаюсь разобрать XML-файл в JSON. Хотя я могу успешно выполнить синтаксический анализ с использованием HashMap, используемый мной XML-файл содержит много нерелевантной информации, которая также отражается в JSON.
Мой XML-файл представляет собой файл топологии, в основном топологии для сетевых элементов и их соответствующих процессов. Итак, он разделен на родительский и дочерний узлы. Большая часть необходимой информации, которую я ищу, относится к родительским узлам, и я хочу любыми способами игнорировать дочерние узлы, чтобы в JSON были доступны только родительские узлы.
Вот код, который я написал для синтаксического анализа. Я пытался написать код для получения дочерних enter code here
узлов, но я не могу понять, как их удалить (например, какие условия я могу использовать):
static String nodeType1,nodeType;
static String nodeName1,nodeName;
static String nodeIP1,nodeIP;
public static void main(String[] args) {
try { File fXmlFile = new File("SystemTopology.txt");
DocumentBuilderFactory dbFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("SNOSNE") ;
Map<String, Object> data = new HashMap<String, Object>();
for (int temp = 0; temp < nList.getLength(); temp ) {
Node nNode = nList.item(temp);
Element el = (Element) nNode;
nodeType = el.getAttribute("snostype");
nodeName = el.getAttribute("cimname");
nodeIP = el.getAttribute("snoshostip");
NodeList list = el.getChildNodes();
for (int i = 0; i < list.getLength(); i ) {
Node nNode1 = list.item(i);
if(list.item(i).getNodeType() == Node.ELEMENT_NODE){
Element element = (Element) list.item(i);
nodeType1 = element.getAttribute("snostype");
nodeName1 = element.getAttribute("cimname");
nodeIP1 = element.getAttribute("snoshostip");
if(!nodeIP1.isEmpty()) {
System.out.println(nodeType1);
System.out.println(nodeName1);
System.out.println(nodeIP1);
}
}
}
//Need to add conditions here that would get only child nodes
if(!nodeIP.isEmpty()) {
data.put(nodeName, nodeType "," nodeIP);
}
}
JSONObject json = new JSONObject(data);
System.out.printf( "JSON: %s", json.toString(2));
}
catch (Exception excp)
{
System.out.println("topology file not found " excp.getMessage());
}
Файл топологии выглядит следующим образом:
<SNOSNE cimname="EDA_01" snoshostip="1.1.1.1" snostype="EDA">
<SNOSNE cimname="Resources" snoshostip="1.1.1.1" snostype="EDA">
</SNOSNE>
<SNOSNE cimname="CPU" snoshostip="1.1.1.1" snostype="EDA">
</SNOSNE>
...
...
...
</SNOSNE>
Ожидаемый вывод должен содержать только родительский файл с cimname =»EDA_01″. И все дочерние узлы должны быть проигнорированы в выводе JSON.
Комментарии:
1. Вы могли бы использовать XPath и / или XSLT для фильтрации интересующих вас элементов, в XSLT 3 (поддерживаемом для Java Saxon 9.8 и 9.9 HE с открытым исходным кодом) вы даже можете напрямую сконструировать JSON (см. xqueryfiddle. liberty-development.net/6qM2e2i где
array { //SNOSNE[@cimname = 'EDA_01']!map { @cimname : @snostype || ',' || @snoshostip } }
используется чистый XPath 3.1 в XQuery 3.1 только для определения правильной сериализации. Возможно, вам потребуется немного подробнее объяснить, как выглядит ваш XML и какой JSON вы хотите создать.2. На самом деле, единственное, что мне нужно сделать, это определить условие, которое будет применено к snoshostip, чтобы сделать его таким, чтобы, если оно встречается один раз в родительском узле, оно должно пропускать дочерние узлы, потому что у них был бы тот же snoshostip, что и у родительского. Я попытался поместить ключ hashmap в качестве snoshostip, но это сканирует XML и выдает последний экземпляр snoshostip в JSON. Я хочу обратного, если snoshostip найден на родительском, он пропускает дочерние узлы и переходит к следующему родительскому.
3. XPath (даже версии 1.0) может выразить ваше требование, например,
//SNOSNE[@snoshostip and not ancestor::SNOSNE/@snoshostip]
поэтому использование XPath может помочь вам перейти только к тем элементам, которые вы ищете.