Как я получаю текст элемента в разметке CDATA через XPath?

Использование библиотеки Glide :

Glide.with(context)
  .load(new File(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);

30
задан Gishu 20 February 2009 в 04:51
поделиться

5 ответов

я думаю поток, на который Вы сослались, говорит, что сама разметка CDATA проигнорирована XPath, не текстом, содержавшимся в разметке CDATA.

мое предположение - то, что проблема с инструментом, исходный код доступен для скачивания, возможно, можно отладить его...

9
ответ дан 28 November 2019 в 00:10
поделиться

/Obj/Name/text() XPath для возврата содержания разметки CDATA.

то, Что отбросило меня, было поведением свойства Value. Для XMLNode (мир DOM), XmlNode. Свойство значения Элемента (с CDATA или иначе) возвращает Пустой указатель. Свойство InnerText дало бы Вам содержание CDATA/Text. Если Вы используете Xml. Linq, XElement. Значение возвращает содержание CDATA.

string sXml = @"
<object>
    <name><![CDATA[SomeText]]></name>
    <name>OtherName</name>
</object>";

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml( sXml );
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);

Console.WriteLine(@"XPath = /object/name" );
WriteNodesToConsole(xmlDoc.SelectNodes("/object/name", nsMgr));

Console.WriteLine(@"XPath = /object/name/text()" );
WriteNodesToConsole( xmlDoc.SelectNodes("/object/name/text()", nsMgr) );

Console.WriteLine(@"Xml.Linq = obRoot.Elements(""name"")");
XElement obRoot = XElement.Parse( sXml );
WriteNodesToConsole( obRoot.Elements("name") );

Вывод:

XPath = /object/name
        NodeType = Element
        Value = <null>
        OuterXml = <name><![CDATA[SomeText]]></name>
        InnerXml = <![CDATA[SomeText]]>
        InnerText = SomeText

        NodeType = Element
        Value = <null>
        OuterXml = <name>OtherName</name>
        InnerXml = OtherName
        InnerText = OtherName

XPath = /object/name/text()
        NodeType = CDATA
        Value = SomeText
        OuterXml = <![CDATA[SomeText]]>
        InnerXml =
        InnerText = SomeText

        NodeType = Text
        Value = OtherName
        OuterXml = OtherName
        InnerXml =
        InnerText = OtherName

Xml.Linq = obRoot.Elements("name")
        Value = SomeText
        Value = OtherName

Оказался, что у автора Визуального XPath был TODO для типа CDATA XmlNodes. У небольшого фрагмента кода и меня есть поддержка CDATA теперь. alt text

MainForm.cs

private void Xml2Tree( TreeNode tNode, XmlNode xNode)
{
   ...
   case XmlNodeType.CDATA:
      //MessageBox.Show("TODO: XmlNodeType.CDATA");
      // Gishu                    
      TreeNode cdataNode = new TreeNode("![CDATA[" + xNode.Value + "]]");
      cdataNode.ForeColor = Color.Blue;
      cdataNode.NodeFont = new Font("Tahoma", 12);
      tNode.Nodes.Add(cdataNode);
      //Gishu
      break;
22
ответ дан 28 November 2019 в 00:10
поделиться

разделы CDATA являются просто частью того, что в XPath известен как text node или в Инфонабор XML как "блоки символьных единиц информации".

, Очевидно, Ваш инструмент неправильный . Другие инструменты, как XPath Visualizer правильно выделяют текст Name элемент при оценке этого выражения XPath:

/*/Name/text()

можно также записать простое преобразование XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
<xsl:template match="/">
  "<xsl:value-of select="/*/Name"/>"
</xsl:template>
</xsl:stylesheet>

, Когда это преобразование применяется на предоставленный XML-документ :

<Obj>
    <Name><![CDATA[SomeText]]></Name>
</Obj>

к корректному результату приводят:

  "SomeText"
10
ответ дан 28 November 2019 в 00:10
поделиться

Посмотрите, помогает ли это - http://www.zrinity.com/xml/xpath/
XPath =/Obj/Name/text ()

3
ответ дан 28 November 2019 в 00:10
поделиться

Предложение заключается в том, чтобы иметь еще одно поле md5 хэша cdata. Тогда вы сможете использовать xpath для запроса на основе md5 без проблем

<sites>
  <site>
    <name>Google</name>
    <url><![CDATA[http://www.google.com]]></url>
    <urlMD5>ed646a3334ca891fd3467db131372140</urlMD5>
  </site>
</sites>

Тогда вы сможете искать:

/sites/site[urlMD5=ed646a3334ca891fd3467db131372140]
-3
ответ дан 28 November 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: