我有以下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标签.
我有以下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不是一种选择.
如何让LINQ to XML iqnore所有命名空间?或者,如何删除名称空间?
我问,因为命名空间是以半随机方式设置的,我厌倦了必须搜索带有和没有命名空间的节点.
有没有什么好方法(也是一种简单的方法)使用Boost来读写XML文件?
我似乎无法使用Boost找到任何简单的示例来读取XML文件.你能指出一个使用Boost读取和编写XML文件的简单示例吗?
如果不是Boost,是否有任何好的和简单的库来读写您可以推荐的XML文件?(它必须是C++库)
当我的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)
有任何想法吗?
我是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)
我想换Gradient6204到Gradient9999.
我写了这个命令,它不起作用(只返回原始文件).
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:
<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,以便拉出所有浪漫书籍?或者也许所有的浪漫和政治书籍?
我正在尝试使用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查询(摘录显示):
<?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/webdynpro在d遇到时返回).在这种情况下,getNamespaceURI调用它,但XPath表达式求值的结果始终为空字符串.
如果我从文件和XPath查询表达式中删除命名空间,我可以获得我想要的字符串(com.test.mypackage).
有没有办法使用默认命名空间使事情正常工作?
这个问题旨在作为回答一个特别常见的问题的参考,这个问题可能有不同的形式:
如果您的问题已作为此问题的副本关闭,则可能与这些示例不同,但此页面应告诉您需要了解的内容.
这是一个说明性的例子:
$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)
为什么不呢,你应该用什么呢?
xml ×8
xpath ×6
java ×2
.net ×1
boost ×1
c++ ×1
elementtree ×1
linq ×1
namespaces ×1
php ×1
python ×1
simplexml ×1
svg ×1
xml-parsing ×1
xmlstarlet ×1