xml-parsing 相关问题

XML解析器遍历包含XML树的文本文档,并允许使用层次结构中的信息。将此标记用于实现XML解析器的问题,或者通过使用给定语言的现有解析器生成的问题。

snowflake:无法递归解析xml

我有这个xml [[[[[]]]]]]]]]]]] 解析分层XML就像解开Gordian结一样。您可以嵌套get,xmlget,lateral和flatten子句,但这变得难以阅读且难以维护。我推荐的方法是使用CTE逐步进行。 您可以测试以下CTE。假设您的XML位于定义为类型变体的名为“ XML”的列中的名为“ SRC”的表中。从那里,您可以根据需要进行修改以使用复制语句。 with IMAGES("VALUE") as ( select "VALUE" from SRC, lateral flatten(SRC.XML:"$") IMAGES where "KEY" = '$' ), IMAGE_ARRAY(IMAGE) as ( select I."VALUE" from IMAGES, lateral flatten(IMAGES."VALUE") I where "KEY" = '$' ), IMAGE(IMAGE_XML) as ( select "VALUE" from IMAGE_ARRAY, lateral flatten(input => to_array(IMAGE)) IMG ) select get(IMAGE_XML, '@path')::string as PATH, get(get(IMAGE_XML, '$'), '@xml:lang')::string as LANG from IMAGE ;

回答 1 投票 0

如何使用xquery搜索具有多个相同类型节点的SQL XML列?

我在SQL中有一列保存XML数据。我想搜索它,但是目前没有得到想要的结果。 XML具有以下格式: [[[[] ]

回答 1 投票 1

对Scopus Search API进行搜索时出错,并将结果分批保存到xml文件中

[我正在尝试使用rscopus并使用从https://github.com/christopherBelter/scopusAPI获得的功能从Scopus提取摘要,我使用我的大学帐户拥有API密钥,但是...

回答 1 投票 0

解析从第三方Web服务读取的未知XML

我正在尝试分析这样的XML值(从第三方Web服务获得),将这些值插入tStringlist中以供以后检查它们...] >>

回答 1 投票 1

读取xml文件包含破坏日语字符的多语言字符

具有如下编码的Xml文件:包含一些如下所述的日语字符:

回答 1 投票 0

如果使用python在给定列表中出现另一个属性,如何提取XML属性?

我有一个linkId的列表。 links_o_i = [652518、345004、225317、177396、551734]此外,我有一个XML文件,其结构如下:

回答 1 投票 0

此页面包含以下错误:第2行第6列错误:仅在文档开头允许XML声明

我无法找到解决方案,请帮助。下面是代码。在此先感谢require_once“ db.php”; $ sQuery =“从汽车中选择价格,年,车号”; $ result = $ conn-> query(...

回答 1 投票 0

使用Python和ElementTree排序XML文档

我正在尝试重组一些xm l文件,这些文件包含完整路由的多个段,这些段的结构如下: GPSRoute.XML ]]]] < [ 我认为,直到到达xpath 3.1为止,还没有真正的方法对xml进行排序,但是有可能在此方面产生混乱。 [请注意,由于您问题中的xml无效(您有未声明的名称空间),因此我使用了更为宽容的html解析器。使用您的实际代码,您应该使用xml解析器,如下所示。 此代码的作用是从每个<name>父节点收集每个<trkseg>子节点的节点值(即您的目标编号),将它们保存到列表中,对列表进行排序,然后再次使用排序后的列表按此排序顺序选择<trkseg>节点,并使用它们(以及开始和结束标记)来创建新的xml。 import lxml.html as lh # with actual xml you would probably use "from lxml import etree" trk = """your xml above""" doc = lh.fromstring(trk) # with actual xml you should probably use "doc = etree.XML(trk)" names = [] new_trk = """<trk> <name>GPSRoute.XML</name>""" # this is the preamble which is left untouched for nam in doc.xpath('//extensions//name'): names.append(nam.text) #grab the numbers for name in sorted(names): #sort the grabbed numbers target = doc.xpath(f'//trkseg[.//name/text()={name}]') for t in target: new_trk += lh.tostring(t).decode() new_trk += '</trk>' # append the closing tag, which is also left untouched print(new_trk) 输出: <trk> <name>GPSRoute.XML</name><trkseg> <trkpt lat="37.077888" lon="-112.242783"> <ele>1688.00</ele> <time>2020-04-18T01:56:39.80Z</time> </trkpt> <extensions> <name>1</name> <color>#00ce00</color> </extensions> </trkseg> <trkseg> <trkpt lat="37.077882" lon="-112.242785"> <ele>1688.00</ele> <time>2020-04-18T01:56:39.80Z</time> </trkpt> <extensions> <name>14</name> <color>#00ce00</color> </extensions> </trkseg> </trk>

回答 1 投票 0

Async / Await order [duplicate]

我正在研究一个小型解析器,该解析器同时查看rss.xml文件并从我在xml项内找到的链接中提取信息。我现在可以获得我正在寻找的所有信息,现在我的...

回答 2 投票 0

使用Python ElementTree从xml文档中提取文本

我有以下格式的xml文档 记住 []

回答 2 投票 1

如何用python代码解析多个xml文件?

[嗨,我想在我的python代码中解析2个xml文件。并想使用config.xml中的标签值替换strings.xml中的标签值。由于我是python的新手,所以我没有任何线索。这是我的代码:** import ...

回答 1 投票 0

Java“序言中不允许内容。”

我正在编写一个可以保留位置,查看可用位置,查看已预订的位置并取消保留的位置的客户端。我的代码适用于除保留插槽以外的所有内容。以下是...

回答 1 投票 0

如何解析大型复杂xml

我需要解析一个大型的复杂xml并写入一个Flat文件,您能提供一些建议吗?文件大小:500MB记录计数:100K XML结构: [ 在Spring Batch中,我编写了自己的stax事件项读取器实现,该实现的操作比前面提到的更加具体。基本上,我只是将元素填充到地图中,然后将其传递给ItemProcessor。在这里,您可以从“ GatheredElement”将其随意转换为单个对象(请参见CompositeItemProcessor)。很抱歉从StaxEventItemReader复制/粘贴一些内容,但我认为这是不可避免的。 从这里,您可以随意使用任何OXM编组器,我也恰好也使用JAXB。 public class ElementGatheringStaxEventItemReader<T> extends StaxEventItemReader<T> { private Map<String, String> gatheredElements; private Set<String> elementsToGather; ... @Override protected boolean moveCursorToNextFragment(XMLEventReader reader) throws NonTransientResourceException { try { while (true) { while (reader.peek() != null && !reader.peek().isStartElement()) { reader.nextEvent(); } if (reader.peek() == null) { return false; } QName startElementName = ((StartElement) reader.peek()).getName(); if(elementsToGather.contains(startElementName.getLocalPart())) { reader.nextEvent(); // move past the actual start element XMLEvent dataEvent = reader.nextEvent(); gatheredElements.put(startElementName.getLocalPart(), dataEvent.asCharacters().getData()); continue; } if (startElementName.getLocalPart().equals(fragmentRootElementName)) { if (fragmentRootElementNameSpace == null || startElementName.getNamespaceURI().equals(fragmentRootElementNameSpace)) { return true; } } reader.nextEvent(); } } catch (XMLStreamException e) { throw new NonTransientResourceException("Error while reading from event reader", e); } } @SuppressWarnings("unchecked") @Override protected T doRead() throws Exception { T item = super.doRead(); if(null == item) return null; T result = (T) new GatheredElementItem<T>(item, new HashedMap(gatheredElements)); if(log.isDebugEnabled()) log.debug("Read GatheredElementItem: " + result); return result; } 收集的元素类非常基础: public class GatheredElementItem<T> { private final T item; private final Map<String, String> gatheredElements; ... } 我还没有处理过这么大的xml文件,但是考虑到您的问题,由于您想解析xml并写入平面文件,因此我猜测XML Pull Parsing和智能代码的组合写入平面文件(this might help),因为我们不想耗尽Java堆。您可以在Google上快速搜索有关使用XML Pull Parsing的教程和示例代码。 最后,我实现了自定义的StaxEventItemReader。 ConfigfragmentRootElementName 配置我自己的manualHandleElement <property name="manualHandleElement"> <list> <map> <entry> <key><value>startElementName</value></key> <value>GroupA</value> </entry> <entry> <key><value>endElementName</value></key> <value>GroupAHeader</value> </entry> <entry> <key><value>elementNameList</value></key> <list> <value>/GroupAHeader/Info1</value> <value>/GroupAHeader/Info2</value> </list> </entry> </map> </list> 在MyStaxEventItemReader.doRead()中添加以下片段 while(true){ if(reader.peek() != null && reader.peek().isStartElement()){ pathList.add("/"+((StartElement) reader.peek()).getName().getLocalPart()); reader.nextEvent(); continue; } if(reader.peek() != null && reader.peek().isEndElement()){ pathList.remove("/"+((EndElement) reader.peek()).getName().getLocalPart()); if(isManualHandleEndElement(((EndElement) reader.peek()).getName().getLocalPart())){ pathList.clear(); reader.nextEvent(); break; } reader.nextEvent(); continue; } if(reader.peek() != null && reader.peek().isCharacters()){ CharacterEvent charEvent = (CharacterEvent)reader.nextEvent(); String currentPath = getCurrentPath(pathList); String startElementName = (String)currentManualHandleStartElement.get(MANUAL_HANDLE_START_ELEMENT_NAME); for(Object s : (List)currentManualHandleStartElement.get(MANUAL_HANDLE_ELEMENT_NAME_LIST)){ if(("/"+startElementName+s).equals(currentPath)){ map.put(getCurrentPath(pathList), charEvent.getData()); break; } } continue; } reader.nextEvent(); } 尝试使用一些ETL工具,如 Pentaho Data Integration (AKA Kettle) 如果您接受JAXB / Spring Batch之外的解决方案,则可能需要看一下SAX Parser。 这是一种更面向事件的XML文件解析方式,当您希望在解析时直接写入目标文件时,这可能是一个好方法。 SAX解析器不会将整个xml内容读取到内存中,而是会在输入流中对元素进行封装时触发方法。据我所知,这是一种非常节省内存的处理方式。 与Stax-Solution相比,SAX将数据“推送”到您的应用程序中-这意味着您必须保持状态(例如您正确地使用哪个标签),因此您必须跟踪当前位置。我不确定这是否是您真正需要的东西 以下示例在您的结构中读取一个xml文件,并打印出GroupBMsg-Tags中的所有文本: import java.io.FileReader; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class SaxExample implements ContentHandler { private String currentValue; public static void main(final String[] args) throws Exception { final XMLReader xmlReader = XMLReaderFactory.createXMLReader(); final FileReader reader = new FileReader("datasource.xml"); final InputSource inputSource = new InputSource(reader); xmlReader.setContentHandler(new SaxExample()); xmlReader.parse(inputSource); } @Override public void characters(final char[] ch, final int start, final int length) throws SAXException { currentValue = new String(ch, start, length); } @Override public void startElement(final String uri, final String localName, final String qName, final Attributes atts) throws SAXException { // react on the beginning of tag "GroupBMsg" <GroupBMSg> if (localName.equals("GroupBMsg")) { currentValue=""; } } @Override public void endElement(final String uri, final String localName, final String qName) throws SAXException { // react on the ending of tag "GroupBMsg" </GroupBMSg> if (localName.equals("GroupBMsg")) { // TODO: write into file System.out.println(currentValue); } } // the rest is boilerplate code for sax @Override public void endDocument() throws SAXException {} @Override public void endPrefixMapping(final String prefix) throws SAXException {} @Override public void ignorableWhitespace(final char[] ch, final int start, final int length) throws SAXException {} @Override public void processingInstruction(final String target, final String data) throws SAXException {} @Override public void setDocumentLocator(final Locator locator) { } @Override public void skippedEntity(final String name) throws SAXException {} @Override public void startDocument() throws SAXException {} @Override public void startPrefixMapping(final String prefix, final String uri) throws SAXException {} } 您可以使用Declarative Stream Mapping (DSM)流解析库。它可以处理JSON和XML。它不会将XML文件加载到内存中。 DSM仅处理您在YAML或JSON配置中定义的数据。 您可以在读取XML时调用method。这使您可以部分处理XML。您可以反序列化将部分XML数据读取到Java对象。 即使您可以使用它来读入多线程。 您可以在此答案中找到很好的例子 Unmarshalling XML to three lists of different objects using STAX Parser JAVA - Best approach to parse huge (extra large) JSON file(与XML相同)

回答 6 投票 5

使用Retrofit2解析XML。多个结果列表不起作用

我正在使用Retrofit2 V2.6.0作为REST客户端来连接Goodreads的api。由于Goodreads的api返回XML格式的数据,因此我使用SimpleXML V2.6.0作为转换器。我一直在转换...

回答 1 投票 0

将AsciiDoc映射到docx模板

我最近一直在使用DefectDoku(一种安全管理和报告工具),该报告将报告输出为AsciiDoc...。我希望能够将报告映射到我的docx模板中。我一直在寻找...

回答 1 投票 0

如何解析xsd并使用python从中创建XML?

我非常熟悉python,我的任务是将xsd模式解析为python代码,用值填充节点并从中创建最终的XML文件。 generateDS工具可以吗?我找不到清晰的...

回答 1 投票 0

创建python objectify元素,然后添加属性

我正在尝试将包含字典作为属性的名为Origin的python类序列化为带有lxml objectify的xml。该字典用每个键的值“ default”初始化。 ...

回答 1 投票 0

从nsdata到nsstring到nsdata

我正在呼叫Web服务。 Web服务以xml格式返回数据。现在的问题是未以正确的格式接收xml数据。它以html格式代替“”。所以...

回答 1 投票 0

如何从包含多个xml的输入xml文件中分别创建多个xml文件

将AllFile.xml作为输入,并生成四个输出xml。输入文件的大小大于100MB。输入xml文件(AllFiles.xml):- [[]] 您可以尝试类似的方法,这可能不是最佳方法。我只是举了一个例子。应根据要求写入文件。 public static void main( String[] args ) { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<canonMessage xmlns=\"\" xmlns:xsi=\"\">\n" + "<header>\n" + "</header>\n" + "<trailer>\n" + "</trailer>\n" + "</canonMessage>\n" + "//some raw strings\n" + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<canonMessage xmlns=\"\" xmlns:xsi=\"\">\n" + "<header>\n" + "</header>\n" + "<trailer>\n" + "</trailer>\n" + "</canonMessage>\n" + "\n" + "//some raw strings\n" + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<canonMessage xmlns=\"\" xmlns:xsi=\"\">\n" + "<header>\n" + "</header>\n" + "<trailer>\n" + "</trailer>\n" + "</canonMessage>\n" + "\n" + "//some raw strings\n" + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<canonMessage xmlns=\"\" xmlns:xsi=\"\">\n" + "<header>\n" + "</header>\n" + "<trailer>\n" + "</trailer>\n" + "</canonMessage>"; Pattern p = Pattern.compile( "(<canonMessage)([\\s\\S]*?)(>)([\\s\\S]*?)(<\\/canonMessage>)" ); Matcher matcher = p.matcher( xml ); int iteration = 0; while( matcher.find() ) { String fileStr= matcher.group( ); System.out.println( fileStr ); System.out.println( "\n\n" ); BufferedWriter writer; try { writer = new BufferedWriter( new FileWriter ( "file" + iteration + ".xml") ); writer.write( fileStr ); writer.flush( ); writer.close(); } catch( IOException e ) { e.printStackTrace(); } iteration++; } }

回答 1 投票 0

Python ElementTree“未找到元素”异常

imports:import io import xml.etree.ElementTree as ElementTree注意:在相同的例外情况下,我也查看了其他线程,他们都提到了潜在的问题是XML文件可能会...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.