XML解析器遍历包含XML树的文本文档,并允许使用层次结构中的信息。将此标记用于实现XML解析器的问题,或者通过使用给定语言的现有解析器生成的问题。
[[[[[[[[[[[[[>] 您应该考虑按顺序查询XML report =>location => day ==> hour。尝试一下:
我的代码在selenium-java中,我需要在XML边缘浏览器中打开的.XML中的Identifiers(第二行,而不是第四行)的值。我的XML: ... ] >>
我有以下代码:声明@mydoc xml声明@myPhone nvarchar(12)='2223334445'声明@lastName nvarchar(100)='约翰'声明@myEmail nvarchar(100)=空集@mydoc =' ...
我有一个XAML文件,其中的标签是这样的: 您可以使用简单的XPath-1.0表达式,例如 count(//ActorName[@Enabled='True']) 使用Java。只需根据需要调整以下XPathExpression。当然,文件名可以是sample.xaml或类似名称。这是示例代码: import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class a { public static void main(String[] args) { try { File inputFile = new File("sample.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); dbFactory.setValidating(false); DocumentBuilder dBuilder; dBuilder=dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); String XPathExpression = "count(//ActorName[@Enabled='True'])"; // Get the count of the elements with the given properties Number cnt = (Number)xPath.compile(XPathExpression).evaluate(doc, XPathConstants.NUMBER); // Convert the Float value to an int value and output System.out.println("Items: "+cnt.intValue()); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } }
我正在尝试针对新图像的宽度和高度转换xml文件中的边界框坐标。下面给出了示例xml文件: ] [] 为了改善代码,您可以: 计算循环前的比率 删除无用的浮点转换 删除除法(除法是一个乘法) 不需要对浮子进行四舍五入 将语句按连贯的顺序分组 将allBoxes重命名为box,因为它仅表示一个box 这里是可能的代码: import xml.etree.ElementTree as ET label_file = '1.xml' tree = ET.parse(label_file) root = tree.getroot() r_w = 1080 / 1820 r_h = 720 / 940 for image in root.findall('image'): image.attrib['width'] = '1080' # Original width = 1820 image.attrib['height'] = '720' # Original width = 940 for box in image.findall('box'): xmin = float(box.attrib['xtl']) ymin = float(box.attrib['ytl']) xmax = float(box.attrib['xbr']) ymax = float(box.attrib['ybr']) xminNew = xmin * r_w yminNew = ymin * r_h xmaxNew = xmax * r_w ymaxNew = ymax * r_h box.attrib['xtl'] = str(xminNew) box.attrib['ytl'] = str(yminNew) box.attrib['xbr'] = str(xmaxNew) box.attrib['ybr'] = str(ymaxNew) tree.write(label_file) 您可以通过将所有这些包装在函数中以提高可用性,清晰度和可能的重用性来进一步改进此代码。 [使用Python的第三方模块lxml考虑参数化的XSLT解决方案,您可以在其中传递来自Python的新的width和height值,以将公式动态应用于XML属性。 XSLT (另存为.xsl文件) lxml Python ((无<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" encoding="utf-8"/> <xsl:strip-space elements="*"/> <!-- PARAMS WITH DEFAULTS --> <xsl:param name="new_width" select="1080"/> <xsl:param name="new_height" select="720"/> <!-- IDENTITY TRANSFORM --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- WIDTH AND HEIGHT ATTRS CHANGE --> <xsl:template match="image"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:attribute name="width"><xsl:value-of select="$new_width"/></xsl:attribute> <xsl:attribute name="height"><xsl:value-of select="$new_height"/></xsl:attribute> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> <!-- X ATTRS CHANGE --> <xsl:template match="box/@xbr|box/@xtl"> <xsl:variable select="ancestor::image/@width" name="curr_width"/> <xsl:attribute name="{name(.)}"> <xsl:value-of select="format-number(. div ($curr_width div $new_width) , '#.00000')"/> </xsl:attribute> </xsl:template> <!-- Y ATTRS CHANGE --> <xsl:template match="box/@ybr|box/@ytl"> <xsl:variable select="ancestor::image/@height" name="curr_height"/> <xsl:attribute name="{name(.)}"> <xsl:value-of select="format-number(. div ($curr_height div $new_height), '#.00000')"/> </xsl:attribute> </xsl:template> </xsl:stylesheet> 循环或for逻辑) if 输出 import lxml.etree as et # LOAD XML AND XSL SCRIPT xml = et.parse('Input.xml') xsl = et.parse('Script.xsl') # PASS PARAMETERS TO XSLT transform = et.XSLT(xsl) result = transform(xml, new_width = et.XSLT.strparam(str(1080)), new_height = et.XSLT.strparam(str(720))) # SAVE RESULT TO FILE with open("Output.xml", 'wb') as f: f.write(result)
我有这个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 ;
如何使用xquery搜索具有多个相同类型节点的SQL XML列?
我在SQL中有一列保存XML数据。我想搜索它,但是目前没有得到想要的结果。 XML具有以下格式: [[[[] ]
对Scopus Search API进行搜索时出错,并将结果分批保存到xml文件中
[我正在尝试使用rscopus并使用从https://github.com/christopherBelter/scopusAPI获得的功能从Scopus提取摘要,我使用我的大学帐户拥有API密钥,但是...
我正在尝试分析这样的XML值(从第三方Web服务获得),将这些值插入tStringlist中以供以后检查它们...] >>
如果使用python在给定列表中出现另一个属性,如何提取XML属性?
我有一个linkId的列表。 links_o_i = [652518、345004、225317、177396、551734]此外,我有一个XML文件,其结构如下:
此页面包含以下错误:第2行第6列错误:仅在文档开头允许XML声明
我无法找到解决方案,请帮助。下面是代码。在此先感谢require_once“ db.php”; $ sQuery =“从汽车中选择价格,年,车号”; $ result = $ conn-> query(...
我正在尝试重组一些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>
Async / Await order [duplicate]
我正在研究一个小型解析器,该解析器同时查看rss.xml文件并从我在xml项内找到的链接中提取信息。我现在可以获得我正在寻找的所有信息,现在我的...
[嗨,我想在我的python代码中解析2个xml文件。并想使用config.xml中的标签值替换strings.xml中的标签值。由于我是python的新手,所以我没有任何线索。这是我的代码:** import ...
我正在编写一个可以保留位置,查看可用位置,查看已预订的位置并取消保留的位置的客户端。我的代码适用于除保留插槽以外的所有内容。以下是...
我需要解析一个大型的复杂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相同)