代码之家  ›  专栏  ›  技术社区  ›  MaxiReglisse

使用xmllint和xpath提取geoserver SLD文件中属性版本的值

  •  0
  • MaxiReglisse  · 技术社区  · 6 年前

    我需要为GeoServer提取SLD文件的版本,这是一种基于XML的标记语言。版本是元素StyledLayerDescriptor的属性。

    以下是xml文件:

    $ cat my_geoserver_sld_file.sld
    <?xml version="1.0" encoding="ISO-8859-1"?>
      <StyledLayerDescriptor version="1.0.0"
        xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
        xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
        xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <NamedLayer>
          <Name>230_sld_shp_line__230_test_sld_shp_line</Name>
            <UserStyle>
            <Title>A green line style</Title>
            <FeatureTypeStyle>
              <Rule>
                 <Title>green line</Title>
                 <LineSymbolizer>
                   <Stroke>
                     <CssParameter name="stroke">#00ff00</CssParameter>
                   </Stroke>
                 </LineSymbolizer>
              </Rule>
            </FeatureTypeStyle>
          </UserStyle>
        </NamedLayer>
      </StyledLayerDescriptor>
    

    我想设置:version=“1.0.0”

    首先,使用de“xmllint--shell”命令打开文件,以便使用xpath:

    $ xmllint --shell my_geoserver_sld_file.sld
    / > xpath *
    Object is a Node Set :
    Set contains 1 nodes:
    1  ELEMENT StyledLayerDescriptor
        default namespace href=http://www.opengis.net/sld
        namespace ogc href=http://www.opengis.net/ogc
        namespace xlink href=http://www.w3.org/1999/xlink
        namespace xsi href=http://www.w3.org/2001/XMLSchema-instanc...
        ATTRIBUTE version
          TEXT
            content=1.0.0
        ATTRIBUTE schemaLocation
          TEXT
            content=http://www.opengis.net/sld http://schema...
    

    提取版本应该很简单,但它失败了。。。

    / > cat //StyledLayerDescriptor/version/text()
    / >
    

    如何在bash变量中设置版本?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Daniel Haley    6 年前

    由于默认命名空间,XPath无法工作( http://www.opengis.net/sld )在XML中。

    See this answer 有关在xmllint中处理默认名称空间的一些选项。

    此外,由于您尝试选择的属性位于根元素上,因此只需使用 /* 在xpath中。。。

    xmllint --xpath "/*/@version" my_geoserver_sld_file.sld
    

    这将返回 version="1.0.0" .如果你只是想要 1.0.0 使用 string() 。。。

    xmllint --xpath "string(/*/@version)" my_geoserver_sld_file.sld
    
        2
  •  0
  •   MaxiReglisse    6 年前

    正如Daniel Halley所建议的,可以使用local-name()来匹配元素名称StyledLayerDescriptor:

    xmllint --xpath "string(/*[local-name()='StyledLayerDescriptor']/@version)" my_geoserver_sld_file.sld