相关疑难解决方法(0)

通过'ElementTree'在Python中解析带有命名空间的XML

我有以下XML,我想用Python解析ElementTree:

<rdf:RDF xml:base="http://dbpedia.org/ontology/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns="http://dbpedia.org/ontology/">

    <owl:Class rdf:about="http://dbpedia.org/ontology/BasketballLeague">
        <rdfs:label xml:lang="en">basketball league</rdfs:label>
        <rdfs:comment xml:lang="en">
          a group of sports teams that compete against each other
          in Basketball
        </rdfs:comment>
    </owl:Class>

</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)

我想找到所有owl:Class标签,然后提取其中所有rdfs:label实例的值.我使用以下代码:

tree = ET.parse("filename")
root = tree.getroot()
root.findall('owl:Class')
Run Code Online (Sandbox Code Playgroud)

由于命名空间,我收到以下错误.

SyntaxError: prefix 'owl' not found in prefix map
Run Code Online (Sandbox Code Playgroud)

我尝试在http://effbot.org/zone/element-namespaces.htm上阅读该文档,但由于上述XML具有多个嵌套命名空间,因此我仍然无法正常工作.

请告诉我如何更改代码以查找所有owl:Class标签.

python xml elementtree xml-namespaces xml-parsing

148
推荐指数
5
解决办法
12万
查看次数

破解我的xpath的Xml命名空间!

我有以下XML:

<List xmlns="http://schemas.microsoft.com/sharepoint/soap/">
 <Fields>
   <Field>
   </Field>
 </Fields>
</List>
Run Code Online (Sandbox Code Playgroud)

这是从SharePoint Web服务返回的XML的精简版本.我也有以下xPath:

/List/Fields/Field
Run Code Online (Sandbox Code Playgroud)

当我xmlns从我的XML中删除xPath工作正常.当它在那里时我的xPath什么都没找到.我的xPath应该做些什么?修改XML不是一种选择.

xml xpath xml-namespaces

84
推荐指数
3
解决办法
7万
查看次数

忽略LINQ to XML中的名称空间

如何让LINQ to XML iqnore所有命名空间?或者,如何删除名称空间?

我问,因为命名空间是以半随机方式设置的,我厌倦了必须搜索带有和没有命名空间的节点.

.net xml linq

83
推荐指数
2
解决办法
2万
查看次数

使用Boost读写XML文件

有没有什么好方法(也是一种简单的方法)使用Boost来读写XML文件?

我似乎无法使用Boost找到任何简单的示例来读取XML文件.你能指出一个使用Boost读取和编写XML文件的简单示例吗?

如果不是Boost,是否有任何好的和简单的库来读写您可以推荐的XML文件?(它必须是C++库)

c++ xml boost

69
推荐指数
5
解决办法
9万
查看次数

如何使用XPath使用Java中的命名空间查询XML?

当我的XML看起来像这样(不xmlns),那么我可以很容易地用XPath查询它/workbook/sheets/sheet[1]

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook>
  <sheets>
    <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
  </sheets>
</workbook>
Run Code Online (Sandbox Code Playgroud)

但是当它看起来像这样我就不能

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  <sheets>
    <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
  </sheets>
</workbook>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

java xml xpath xml-namespaces

61
推荐指数
4
解决办法
9万
查看次数

如何在xmlstarlet中声明XPath名称空间?

我是xmlstarlet的新手,所以希望这个答案很简单.

我正在编写一个脚本来从命令行修改Inkscape SVG文件.我选择了xmlstarlet工具.

在测试文件上测试命令语法后,我在真正的SVG文件上遇到了麻烦.我认为使用命名空间会让我失望.

示例文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->    
<svg
   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="603"
   height="1000"
   viewBox="0 0 159.54375 264.58334"
   version="1.1"
   id="svg8"
   inkscape:version="0.92.1 r"
   sodipodi:docname="test.svg"
   inkscape:export-filename="/home/user/dev/inkscape/test/1.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <defs
     id="defs2">
    <linearGradient
       inkscape:collect="always"
       id="linearGradient6204">
      <stop
         style="stop-color:#8f1a22;stop-opacity:1;"
         offset="0"
         id="stop6200" />
      <stop
         style="stop-color:#8f1a22;stop-opacity:0;"
         offset="1"
         id="stop6202" />
    </linearGradient>
  </defs>
</svg>
Run Code Online (Sandbox Code Playgroud)

我想换Gradient6204Gradient9999.

我写了这个命令,它不起作用(只返回原始文件).

xmlstarlet ed -u "/svg/defs/linearGradient[@id='linearGradient6204']/@id" -v 'linearGradient9999' text.txt
Run Code Online (Sandbox Code Playgroud)

我也再次尝试,添加名称空间与-N但没有运气.我发现如果删除该行:

xmlns="http://www.w3.org/2000/svg"
Run Code Online (Sandbox Code Playgroud)

从文件然后我上面写的命令工作.

以我描述的方式更新上面的SVG文件的正确语法是什么?

xml xpath svg xml-namespaces xmlstarlet

10
推荐指数
1
解决办法
1303
查看次数

基于子值的XPath选择

这是一些xml:

<books>
    <book>
        <author>Tom</author>
        <genres>
            <genre>Science</genre>
            <genre>Romance</genre>
        </genres>
    </book>
    <book>
        <author>Mike</author>
        <genres>
            <genre>Politics</genre>
            <genre>Romance</genre>
        </genres>
    </book>
</books>
Run Code Online (Sandbox Code Playgroud)

如何定义一个xpath,以便拉出所有浪漫书籍?或者也许所有的浪漫和政治书籍?

xml xpath

8
推荐指数
2
解决办法
6774
查看次数

使用命名空间运行xpath查询时出现问题

我正在尝试使用xpath表达式来选择xml文档中的节点集,并定义了不同的名称空间.

xml看起来像这样:

<?POSTEN SND="SE00317644000" REC="5566420989" MSGTYPE="EPIX"?>
<ns:Msg xmlns:ns="http://www.noventus.se/epix1/genericheader.xsd">
  <GenericHeader>
    <SubsysId>1</SubsysId>
    <SubsysType>30003</SubsysType>
    <SendDateTime>2009-08-13T14:28:15</SendDateTime>
  </GenericHeader>
  <m:OrderStatus xmlns:m="http://www.noventus.se/epix1/orderstatus.xsd">
    <Header>
      <OrderSystemId>Soda SE</OrderSystemId>
      <OrderNo>20090811</OrderNo>
      <Status>0</Status>
    </Header>
    <Lines>...
Run Code Online (Sandbox Code Playgroud)

我只想选择"Msg" - 具有"OrderStatus"子节点的节点,因此我想使用以下xpath表达式:/ Msg [count('OrderStatus')> 0]但这不起作用,因为我得到一个错误消息说:"需要命名空间管理器或XsltContext.此查询具有前缀,变量或用户定义的函数".

所以我想我想使用一个看起来像这样的表达式:/*[local-name()='Msg'] [count('OrderStatus')> 0]但这似乎不起作用..任何想法?

BR,

安德烈亚斯

xpath

7
推荐指数
1
解决办法
5557
查看次数

Java XPath:具有默认命名空间xmlns的查询

我想对这个文件做一个XPath查询(摘录显示):

<?xml version="1.0" encoding="UTF-8"?>
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST -->
<ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0">
    <ModelClass.Parent>
        <Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/>
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码的片段:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document document = builder.parse(new File(testFile));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext( new NamespaceContext() {
    public String getNamespaceURI(String prefix) {
...

String result = xpath.evaluate(xpathQueryString, document);
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,当在XPath查询中引用默认命名空间时,不会调用getNamespaceURI方法来解析它.例如,此查询不提取任何内容:

//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package

现在我尝试通过替换xmlns伪造的前缀来"欺骗"解析器d,然后相应地编写getNamespaceURI方法(以便http://xml.sap.com/2002/10/metamodel/webdynprod遇到时返回).在这种情况下,getNamespaceURI调用它,但XPath表达式求值的结果始终为空字符串.

如果我从文件和XPath查询表达式中删除命名空间,我可以获得我想要的字符串(com.test.mypackage).

有没有办法使用默认命名空间使事情正常工作?

java xml xpath namespaces xml-namespaces

7
推荐指数
2
解决办法
6166
查看次数

参考 - 如何在SimpleXML中处理名称空间(带冒号的标签和属性)?

这个问题旨在作为回答一个特别常见的问题的参考,这个问题可能有不同的形式:

  • 我有一个XML文档,其中包含多个名称空间; 如何使用SimpleXML解析它?
  • 我的XML在标记名称中有一个冒号(":"),如何使用SimpleXML访问它?
  • 当名称中包含冒号时,如何访问XML文件中的属性?

如果您的问题已作为此问题的副本关闭,则可能与这些示例不同,但此页面应告诉您需要了解的内容.

这是一个说明性的例子:

$xml = '
    <?xml version="1.0" encoding="utf-8"?>
    <document xmlns="http://example.com" xmlns:ns2="https://namespaces.example.org/two" xmlns:seq="urn:example:sequences">
        <list type="short">
            <ns2:item seq:position="1">A thing</ns2:item>
            <ns2:item seq:position="2">Another thing</ns2:item>
        </list>
    </document>
';
$sx = simplexml_load_string($xml);
Run Code Online (Sandbox Code Playgroud)

这段代码不起作用 ; 为什么不?

foreach ( $sx->list->ns2:item as $item ) {
    echo 'Position: ' . $item['seq:position'] . "\n";
    echo 'Item: ' . (string)$item . "\n";
}
Run Code Online (Sandbox Code Playgroud)

第一个问题是->ns2:item语法无效; 但将其更改为此也不起作用:

foreach ( $sx->list->{'ns2:item'} as $item ) { ... }
Run Code Online (Sandbox Code Playgroud)

为什么不呢,你应该用什么呢?

php simplexml xml-namespaces

7
推荐指数
1
解决办法
1419
查看次数