jjzjj

c# - 当命名空间不再可用时解析 xml 文档

coder 2024-07-04 原文

我有一些相当大、复杂的 xml 文档需要遍历。文档顶部定义了一个 xmlns,但是它指向的 url 不再可用。

使用 C# 解析文件以从中获取重要数据的最佳方法是什么?

我试图将其加载到数据集中,但偶尔会收到错误消息: 表(端点)不能是嵌套关系中自身的子表。 或者 无法将 SimpleContent 列添加到包含元素列或嵌套关系的表中。

XPath 是我的下一个停靠点,但由于缺少 namespace ,我遇到了问题。

我怀疑这严重限制了我的选择,但有人有什么建议吗?

XML 文档的片段:

<?xml version="1.0" encoding="UTF-8"?>
<cdr:cdr_set xmlns:cdr="http://www.naturalconvergence.com/schema/cdr/v3/cdr">

<!--  Copyright (c) 2001-2009, all rights reserved  -->

<cdr:cdr xmlns:cdr="http://www.naturalconvergence.com/schema/cdr/v3/cdr">
  <cdr:call_id>2040-1247062136726-5485131</cdr:call_id>
  <cdr:cdr_id>1</cdr:cdr_id>
  <cdr:status>Normal</cdr:status>
  <cdr:responsibility>
    <cdr:tenant id="17">
      <cdr:name>SpiriTel plc</cdr:name>
    </cdr:tenant>
    <cdr:site id="45">
      <cdr:name>KWS</cdr:name>
      <cdr:time_zone>GB</cdr:time_zone>
    </cdr:site>
  </cdr:responsibility>
  <cdr:originator type="sipGateway">
    <cdr:sipGateway id="3">
      <cdr:name>Audiocodes-91</cdr:name>
    </cdr:sipGateway>
  </cdr:originator>
  <cdr:terminator type="group">
    <cdr:group>
      <cdr:tenant id="17">
        <cdr:name>SpiriTel plc</cdr:name>
      </cdr:tenant>
      <cdr:type>Broadcast</cdr:type>
      <cdr:extension>6024</cdr:extension>
      <cdr:name>OLD PMS DDIS DO NOT USE</cdr:name>
    </cdr:group>
  </cdr:terminator>
  <cdr:initiation>Dialed</cdr:initiation>
  <cdr:calling_number>02087893850</cdr:calling_number>
  <cdr:dialed_number>01942760142</cdr:dialed_number>
  <cdr:target>6024</cdr:target>
  <cdr:direction>Inbound</cdr:direction>
  <cdr:disposition>No Answer</cdr:disposition>
  <cdr:timezone>GB</cdr:timezone>
  <cdr:origination_timestamp>2009-07-08T15:08:56.727+01:00</cdr:origination_timestamp>
  <cdr:release_timestamp>2009-07-08T15:09:26.493+01:00</cdr:release_timestamp>
  <cdr:release_cause>Normal Clearing</cdr:release_cause>
  <cdr:call_duration>PT29S</cdr:call_duration>
  <cdr:redirected>false</cdr:redirected>
  <cdr:conference>false</cdr:conference>
  <cdr:transferred>false</cdr:transferred>
  <cdr:estimated>false</cdr:estimated>
  <cdr:interim>false</cdr:interim>
  <cdr:segments>
    <cdr:segment>
      <cdr:originationTimestamp>2009-07-08T15:08:56.727+01:00</cdr:originationTimestamp>
      <cdr:initiation>Dialed</cdr:initiation>
      <cdr:call_id>2040-1247062136726-5485131</cdr:call_id>
      <cdr:originator type="sipGateway">
        <cdr:sipGateway id="3">
          <cdr:name>Audiocodes-91</cdr:name>
        </cdr:sipGateway>
      </cdr:originator>
      <cdr:termination_attempt>
        <cdr:termination_timestamp>2009-07-08T15:08:56.728+01:00</cdr:termination_timestamp>
        <cdr:terminator type="group">
          <cdr:group>
            <cdr:tenant id="17">
              <cdr:name>SpiriTel plc</cdr:name>
            </cdr:tenant>
            <cdr:type>Broadcast</cdr:type>
            <cdr:extension>6024</cdr:extension>
            <cdr:name>OLD PMS DDIS DO NOT USE</cdr:name>
          </cdr:group>
        </cdr:terminator>
        <cdr:provided_address>01942760142</cdr:provided_address>
        <cdr:direction>Inbound</cdr:direction>
        <cdr:disposition>No Answer</cdr:disposition>
      </cdr:termination_attempt>
    </cdr:segment>
  </cdr:segments>
</cdr:cdr>

...

</cdr:cdr_set>

每个条目本质上是相同的,但有时会有差异,例如某些字段可能会丢失(如果不需要)。

最佳答案

xml 文件中的这些值是标识符,而不是定位器。除非您希望下载模式,否则根本不需要它,并且可以在需要时“轻率”。我希望最好的办法是将它加载到 XmlDocument/XDocument 中并尝试访问数据。

例如:

XmlDocument doc = new XmlDocument();
doc.Load("cdr.xml");
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("cdr", "http://www.naturalconvergence.com/schema/cdr/v3/cdr");
XmlElement el = (XmlElement)doc.SelectSingleNode(
    "cdr:cdr_set/cdr:cdr/cdr:originator", ns);
Console.WriteLine(el.GetAttribute("type"));

或者遍历 cdr 元素:

    foreach (XmlElement cdr in doc.SelectNodes("/cdr:cdr_set/cdr:cdr", ns))
    {
        Console.WriteLine(cdr.SelectSingleNode("cdr:call_id", ns).InnerText);
    }

请注意,文档中使用的别名在很大程度上与 XmlNamespaceManager 中使用的别名无关,因此您需要重新声明它。我本可以同样轻松地使用 x 作为我在 C# 中的别名。


当然,如果您更喜欢使用对象模型;通过 xsd 运行它(其中 cdr.xml 是您的示例文件):

xsd cdr.xml
xsd cdr.xsd /classes

现在您可以使用 XmlSerializer 加载它。

关于c# - 当命名空间不再可用时解析 xml 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1108687/

有关c# - 当命名空间不再可用时解析 xml 文档的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  9. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  10. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

随机推荐