0

我有这个 XML:

<?xml version="1.0" encoding="UTF-8"?>
<XML xmlns:r="#SchemaA2A">
  <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes" name="SchemaA2A">
    <ElementType name="ROOT" content="eltOnly" model="closed" order="many">
      <AttributeType name="Response" dt:type="i4"/>
      <AttributeType name="ErrorNumber" dt:type="i4"/>
      <AttributeType name="ErrorDescription" dt:type="string"/>
      <AttributeType name="ErrorDisplay" dt:type="boolean"/>
      <attribute type="Response"/>
      <attribute type="ErrorNumber"/>
      <attribute type="ErrorDescription"/>
      <attribute type="ErrorDisplay"/>
    </ElementType>
    <ElementType name="ROW" content="empty" model="closed">
      <AttributeType name="Personid" dt:type="string"/>
      <attribute type="Personid"/>
    </ElementType>
  </Schema>
  <r:ROOT Response="1" ErrorNumber="0" ErrorDescription="" ErrorDisplay="1">
    <r:ROW Personid="1077231296"/>
  </r:ROOT>
</XML>

并且这两个都返回空值:

var person_id = (xmlObject \ "XML" \ "ROOT" \ "ROW" \ "@Personid").text

var person_id = (xmlObject \ "ROOT" \ "ROW" \ "@Personid").text

我做错了什么?

4

2 回答 2

2

尝试:

var person_id = (xmlObject \\ "XML" \ "ROOT" \ "ROW" \ "@Personid").text

或者

var person_id = (xmlObject \\ "ROOT" \ "ROW" \ "@Personid").text
于 2012-08-24T16:32:50.383 回答
0

没有直接回答这个问题,但这里有很多令人担忧的事情,我希望这有助于突出它们......

“xml 已保留”警告/错误是正确的 - xml 规范解释说:

以字符串“xml”开头的名称,或任何与 (('X'|'x') ('M'|'m') ('L'|'l')) 匹配的字符串,都保留用于标准化在本规范的这个或未来版本中

但是,如果您还在这里测试它w3c 验证器,您将完全看不到该错误。其他解析器将正确遵循规范。发送该文档的 Web 服务应该发送有效的 xml,但我们不能总是选择这个。

但是,您确实需要 XMLDecl 标头(?xml 位)。特别是编码,让您的解析器知道如何解析流和处理其他字符集。拥有它是一件非常好的事情。

同样对于使用的“XPath”,它不正确,ROOT 和 ROW 元素位于 #SchemaA2A 命名空间中,尽管它们的属性不是。搜索 \*ROW 应该只匹配空命名空间“”。 Scales Xml XPath(基于DSL字符串)与许多其他 XPath 库一样强制这种区别。Scala Xmls 方法有效,但只有在有人向您发送打破您假设的文档之前。

于 2012-08-25T18:59:08.393 回答