标签: xml-namespaces

如何获取带有命名空间的 XML 元素

我有一个像这样的 XML 文件:

\n\n

我想获取所有标签 a:entry

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<a:feed xmlns:a="http://www.w3.org/2005/Atom" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://schemas.zune.net/catalog/apps/2008/02">\n  <a:link rel="next" type="application/atom+xml" href="/v8/catalog/apps?q=facebook&amp;startIndex=50&amp;chunkSize=50&amp;pagingToken=50%7c50&amp;os=8.0.10512.0&amp;cc=US&amp;oc=&amp;lang=vi-VN&amp;hw=469838850&amp;dm=Virtual&amp;oemId=NOKIA&amp;moId=" />\n  <a:link rel="self" type="application/atom+xml" href="/v8/catalog/apps?q=facebook&amp;chunkSize=50&amp;os=8.0.10512.0&amp;cc=US&amp;oc=&amp;lang=vi-VN&amp;hw=469838850&amp;dm=Virtual&amp;oemId=NOKIA&amp;moId=" />\n  <os:startIndex>0</os:startIndex>\n  <os:totalResults>51</os:totalResults>\n  <os:itemsPerPage>50</os:itemsPerPage>\n  <a:updated>2013-11-01T08:30:11.711450Z</a:updated>\n  <a:title type="text">List Of Items</a:title>\n  <a:id>tag:catalog.zune.net,2013-11-01:/apps</a:id>\n  <pagingToken>50|50</pagingToken>\n  <impressionId>cd11c7b0116143dcb4c99f15b72ebbc4</impressionId>\n  <a:entry>\n    <a:updated>2013-11-01T08:30:11.711450Z</a:updated>\n    <a:title type="text">Facebook</a:title>\n    <a:id>urn:uuid:82a23635-5bd9-df11-a844-00237de2db9e</a:id>\n    <isHardwareCompatible>true</isHardwareCompatible>\n    <sortTitle>Facebook</sortTitle>\n    <releaseDate>2010-10-19T13:07:17.103000Z</releaseDate>\n    <version>5.1.2.0</version>\n    <averageUserRating>5.963479</averageUserRating>\n    <userRatingCount>42825</userRatingCount>\n    <image>\n      <id>urn:uuid:f8b42bcd-45c3-4ea5-9c9e-a108ac33cd6e</id>\n    </image>\n    <hasLiveTile>true</hasLiveTile>\n    <categories>\n      <category>\n        <id>windowsphone.Social</id>\n        <title>ma\xcc\xa3ng xa\xcc\x83 h\xc3\xb4\xcc\xa3i</title>\n        <isRoot>True</isRoot>\n      </category>\n    </categories>\n    <tags>\n      <tag>Independent</tag>\n      <tag>LockScreen_Background</tag>\n      <tag>LockScreen_Notification_IconCount</tag>\n      <tag>LockScreen_Notification_TextField</tag>\n      <tag>phone.protocol.fb</tag>\n    </tags>\n    <offers>\n      <offer>\n        <offerId>urn:uuid:5c6b4028-74c5-4648-a71e-2ca413a5d2fd</offerId>\n        <mediaInstanceId>urn:uuid:64051c69-fb7b-4972-ad42-1dbb2e626a2c</mediaInstanceId>\n        <clientTypes>\n          <clientType>WindowsPhone80</clientType>\n          <clientType>WindowsPhone81</clientType>\n        </clientTypes>\n        <paymentTypes>\n          <paymentType>Credit Card</paymentType>\n          <paymentType>Mobile Operator</paymentType>\n        </paymentTypes>\n        <store>ZEST</store>\n …
Run Code Online (Sandbox Code Playgroud)

c# xml linq-to-xml xml-namespaces

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

重写 XMLDocument 以使用命名空间前缀

我有一个 XMLDocument,当我保存到文件时,它会在大多数元素上重复命名空间,如下所示

<Test>
    <Test xmlns="http://example.com/schema1">

      <Name xmlns="http://example.com/schema2">xyz</Name>
      <AddressInfo xmlns="http://example.com/schema2">
        <Address>address</Address>
        <ZipCode>zzzz</ZipCode>
      </AddressInfo>
       ...
Run Code Online (Sandbox Code Playgroud)

是否可以修改此文件,以便它在整个文档中使用名称空间前缀,即类似的内容

<Test xmlns="http://example.com/schema1" xmlns:p="http://example.com/schema2"  >

 <p:Name>xyz</p:Name>
 <p:AddressInfo">
   <p:Address>address</p:Address>
   <p:ZipCode>zzzz</p:ZipCode>
 </p:AddressInfo>        
 ...
Run Code Online (Sandbox Code Playgroud)

我尝试过添加

   doc.DocumentElement.SetAttribute("xmlns:p", "http://example.com/schema2");
Run Code Online (Sandbox Code Playgroud)

但是,虽然这将命名空间添加到标头中,但文件的主体并未更改。

c# xml xml-namespaces

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

XML 命名空间冲突

我想知道为什么我们必须使用我们组织特有的 URI 来定义命名空间(就像 Java 中的包一样)。这显然是有道理的,可以让我们避免名称冲突。然而,这个页面说:

相同的前缀也可以引用不同的命名空间,具体取决于它们的上下文

所以基本上,如果我有自己的 XML 文档,并将自己的命名空间前缀myNamespace定义为http://hisdomain.com/test,那么有人可以重新定义 'myNamespace' 前缀以指向他自己的命名空间http://hisdomain.com/test即使是错误的(我认为如果我定义的命名空间前缀具有文档中已定义)。

即使使用 URI,其他人也需要确保他们不使用我的前缀!

然后,使用 URI 并必须向命名空间提供定义就变得毫无用处,如果我们仅使用前缀而不必使用属性提供定义,则命名空间系统同样可以正常工作xlns


如果我理解正确的话,这是不允许的:

<root xmlns:abc="mydomain.com/test" xmlns:abc="yourdomain.com/test">
...
</root>
Run Code Online (Sandbox Code Playgroud)

但这没关系 - 您可以abc用您的域名重新定义前缀。

<root xmlns:abc="mydomain.com/test">
    <body xmlns:abc="yourdomain.com/test">
    ...//to use my namespace here, I'd need to redefine it again to mydomain.com/test

    </body>
</root>
Run Code Online (Sandbox Code Playgroud)

xml xml-namespaces

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

排除结果前缀不起作用

我正在尝试编写一个 xslt 转换,该转换在输出的根元素中不包含任何 @xmlns:* 属性。给定这个 xml :

<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
    <jw:a/>
    <b test="1">
        <c/>
    </b>
</jw:root>
Run Code Online (Sandbox Code Playgroud)

和这个样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0"
    xmlns:jw="http://namespace/test/jw" exclude-result-prefixes="jw">

<xsl:template match="node()|@*">
    <xsl:copy>

         <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@test"/>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

我得到这个:

<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
    <jw:a/>
    <b>
        <c/>
    </b>
</jw:root>
Run Code Online (Sandbox Code Playgroud)

我尝试过 - 将 @exclude-result-prefixes 放在根模板上, - 不复制属性, - 不在身份模板中使用“复制”,而是使用 - 使用 #all

我在规范中读过,虽然我现在找不到它,但它<xsl:copy/>忽略了 @exclude-result-prefixes,并且其他东西也可以覆盖它。

有什么方法可以删除那些 @xmlns:[prefix] atts?ns 是在输出使用的 dtd 中定义的,这让我很困惑将它们放在那里。猜猜我将不得不单独通过java打开并以这种方式删除?

谢谢!

xml xslt xml-namespaces

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

由于元素卡在元素上,无法解析XML

问题是ServiceDocument作为xmlns属性.

---预先分配的XML

  System.Xml.XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>
                    <ServiceDocument 
                      xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"
                      xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices\"
                   >
                    <BaseUri>
                       http://xxxx.xxxxx.net/xxx.1/
                   </BaseUri>
                  <ProfilesLink>
                     http://adf.apis.dds.net/af.1/
                 </ProfilesLink>
                <SignedInUser>
                       <Cid>
                           4433sfsdfgd
                       </Cid>
                      <Uri>
                          http://fd.apis.afdafd.net/V4.1/cid-xxxxx/adad
                      </Uri>
               </SignedInUser> 
               <StatusMessageLink>
                      http://psm.adfa.afd.net/dfa.1/
               </StatusMessageLink>
            </ServiceDocument>"
            );
 // Response.Write(xmlDoc.InnerXml);
Run Code Online (Sandbox Code Playgroud)

- // PARSE XML问题低于**

 Response.Write(xmlDoc.SelectSingleNode("/ServiceDocument/BaseUri").InnerXml);
Run Code Online (Sandbox Code Playgroud)

c# xml xpath xml-namespaces

0
推荐指数
1
解决办法
406
查看次数

解析SOAP响应"手动"

我有这个肥皂响应,但我的代码不是读取GetLatestReadingByMeterNoResult孩子.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header/>
  <soapenv:Body>
    <GetLatestReadingByMeterNoResponse xmlns="http://www.multispeak.org/Version_3.0">
     <GetLatestReadingByMeterNoResult objectID="112199498" utility="xxxxx">
      <meterNo>112199498</meterNo> 
      <deviceID>112199498</deviceID> 
      <readingDate>2013-02-27T17:00:00.000Z</readingDate> 
      <posKWh>8406</posKWh> 
      <kW>15.508</kW> 
      <kWDateTime>2013-02-27T17:00:00.000Z</kWDateTime> 
      </GetLatestReadingByMeterNoResult>
     </GetLatestReadingByMeterNoResponse>
  </soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)

码:

XmlDocument resultXml = new XmlDocument();
XmlNamespaceManager mgr = new XmlNamespaceManager(resultXml.NameTable);
mgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
mgr.AddNamespace("", "http://www.multispeak.org/Version_3.0");
resultXml.LoadXml(soapResult);
XmlNodeList nodeList = resultXml.SelectNodes("//GetLatestReadingByMeterNoResult", mgr);
Run Code Online (Sandbox Code Playgroud)

nodeList不返回任何节点

c# xml soap xml-namespaces

0
推荐指数
1
解决办法
2298
查看次数

从YouTube Feed中解析XML(不使用Zend)

我需要从Feed中获取非常具体的值,例如:

http://gdata.youtube.com/feeds/api/videos/iIp7OnHXBlo
Run Code Online (Sandbox Code Playgroud)

我必须从这些奇怪格式的XML提要中读取的一些节点是:

<title type="text">Uploading YouTube Videos with the PHP Client Library</title>

<media:content url="http://www.youtube.com/v/iIp7OnHXBlo?version=3&f=videos&app=youtube_gdata" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="466" yt:format="5"/>
<media:content url="rtsp://v3.cache7.c.youtube.com/CiILENy73wIaGQlaBtdxOnuKiBMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="466" yt:format="1"/>

<media:description type="plain">Jochen Hartmann demonstrates the basics of how to use the PHP Client Library with the YouTube Data API. [...]</media:description>

<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/0.jpg" height="360" width="480" time="00:03:53"/>
<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/1.jpg" height="90" width="120" time="00:01:56.500"/>
<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/2.jpg" height="90" width="120" time="00:03:53"/>
<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/3.jpg" height="90" width="120" time="00:05:49.500"/>
<yt:duration seconds="466"/>
Run Code Online (Sandbox Code Playgroud)

当然,使用Zend Framework API for GData绝对是不可能的(1225个文件和49 MB只是为了解析XML文件?是的,当然......我的主. …

php xml youtube parsing xml-namespaces

0
推荐指数
1
解决办法
3448
查看次数

这么多命名空间有什么意义呢

所以在我的一个xslt文件中,我看到了

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:myxsl="urn:schemas-microsoft-com:xslt"
    xmlns:xsl2="http://www.w3.org/TR/xslt20/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:java="http://xml.apache.org/xalan/java" 
    xmlns:mine="com.my.example.impl.BaseImpl"
    xmlns:m="com.my.example.util.CustomXsltHashMap"  
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    exclude-result-prefixes="myxsl java s mine m xs xsl2">
Run Code Online (Sandbox Code Playgroud)

有人能告诉我这里的每一行是什么意思吗?我真的很感激这些名称空间及其用途的逐行解释?

我在某种程度上使用Java服务中的xslt转换.(不是我的代码).

谢谢

java xml xslt xml-namespaces

0
推荐指数
2
解决办法
208
查看次数

无论结构或名称空间如何,都使用SimpleXML解析名称空间

我有这样的Google购物Feed(摘录):

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">  
...
<g:id><![CDATA[Blah]]></g:id>
<title><![CDATA[Blah]]></title>
<description><![CDATA[Blah]]></description>
<g:product_type><![CDATA[Blah]]></g:product_type>
Run Code Online (Sandbox Code Playgroud)

现在,SimpleXML可以读取"标题"和"描述"标签,但它无法读取带有"g:"前缀的标签.

对于这种特定情况,使用"children"函数在stackoverflow上有解决方案.但是我不仅想要阅读Google Shopping XMLs,我还需要它来自结构或名称空间,我对文件一无所知(我以递归方式循环遍历节点作为多维数组).

有没有办法用SimpleXML做到这一点?我可以替换冒号,但我希望能够存储数组并重新组合XML(在这种情况下专门用于Google购物),所以我不想丢失信息.

php xml simplexml xml-namespaces

0
推荐指数
1
解决办法
2526
查看次数

是否可以在Spring WS Web服务中重命名响应命名空间前缀?

我基于http://spring.io/guides/gs/producing-web-service/上的示例构建了一个Spring WS Web服务.响应包含带有前缀"ns2"的命名空间.

xmlns:ns2="http://www.mycompany.com/somewhere"
Run Code Online (Sandbox Code Playgroud)

皂响应

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns2:mitteilungResponse xmlns:ns2="http://www.mycompany.com/somewhere">
         <ns2:responseContent>
            <ns2:message>Hello World!</ns2:message>
         </ns2:responseContent>
      </ns2:mitteilungResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)

是否可以将该前缀重命名为"myprefix"?怎么样?任何人?

spring web-services spring-ws jaxb xml-namespaces

0
推荐指数
1
解决办法
2960
查看次数

从元素中删除命名空间条目,这是在转换过程中由 XSLT 添加的

我正在使用 xslt 文件来转换一组 xml 文件,xml 中的一些标签是在另一个命名空间中定义的。

xslt 所做的是从 AddBooks 元素标签首先复制所有内容,除了 bookattach 元素,其中属性 bookname = 'AA12' 然后构造一个新元素 bookattach where bookname="AA12" 在所有情况下,并将 bookattach 的所有子项复制到其中 bookname= “AA12”和书名=“A12”。

好吧,xslt 按预期工作,但问题是当它复制元素 bookattach 时,属性 bookname = 'AA12' 在那里添加了名称空间条目。例如,它将条目复制为:

<bookattach xmlns:mynamespace="http://myorg.com/mymodel/Library" bookname="AA12">
<book bookname="bacbook1" description="This is test book1"/>
</bookattach>
Run Code Online (Sandbox Code Playgroud)

我不想在转换后的 xml 中复制这个命名空间条目(我的源 xml 也不包含 bookattach 标记中的命名空间条目),那么我怎样才能摆脱这个特定标记中的这个命名空间条目?

我的 xslt 如下:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:mynamespace="http://myorg.com/mymodel/Library"
                version="1.0">

<xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:output method="xml"/>

    <xsl:key name="bookbyid" match="mynamespace:bookattach" use="@bookname"/>

    <xsl:template match="mynamespace:AddBooks">
        <xsl:copy>
          <xsl:apply-templates select="@*|node() [ not( (self::mynamespace:bookattach and @bookname = …
Run Code Online (Sandbox Code Playgroud)

xslt xml-namespaces xslt-1.0

0
推荐指数
1
解决办法
3353
查看次数

反序列化部分 SOAP 响应

我对肥皂响应的特定部分的反序列化有点迷失。

响应:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body>
    <ns1:LoginResult xmlns:ns1="http://abc.def.schema">
        <sessionId>123456789</sessionId>
        <sessionTimeout>30</sessionTimeout>
        <organizationName>WebService Test Account XYZ</organizationName>
        <userInfoResult>
            <accessibleOrgs>
                <name>WebService Test Account XYZ</name>
                <description/>
                <prefix>10</prefix>
                <countryCallingCode>+49</countryCallingCode>
                <treeLevel>0</treeLevel>
                <timeZone>
                    <timeZoneId>Europe/Berlin</timeZoneId>
                    <currentUtcOffset>3600000</currentUtcOffset>
                </timeZone>
                <billingCompany>COMPANY 123</billingCompany>
                <language>DE</language>
            </accessibleOrgs>
            <isDemo>true</isDemo>
            <prefixLength>0</prefixLength>
            <alarmNumberLength>0</alarmNumberLength>
            <groupNumberLength>0</groupNumberLength>
            <personNumberLength>0</personNumberLength>
        </userInfoResult>
    </ns1:LoginResult>
</soapenv:Body>
Run Code Online (Sandbox Code Playgroud)

我需要反序列化“LoginResult”部分。我知道反序列化方法,但我正在努力解决以下事实:A) 有命名空间,B) 我只需要 XML 的子集。

也许有人可以指出我正确的方向。

提前谢谢

c# xml serialization xml-namespaces deserialization

0
推荐指数
1
解决办法
2268
查看次数